@lemoncat7/dsh-partner 2.22.2 → 2.23.40

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 (290) hide show
  1. package/README.md +6 -2
  2. package/docs/qq-channel.md +19 -3
  3. package/docs/releases/2.22.3.md +7 -0
  4. package/docs/releases/2.22.4.md +7 -0
  5. package/docs/releases/2.22.5.md +5 -0
  6. package/docs/releases/2.22.6.md +3 -0
  7. package/docs/releases/2.23.0.md +7 -0
  8. package/docs/releases/2.23.1.md +7 -0
  9. package/docs/releases/2.23.11.md +9 -0
  10. package/docs/releases/2.23.12.md +11 -0
  11. package/docs/releases/2.23.13.md +13 -0
  12. package/docs/releases/2.23.14.md +11 -0
  13. package/docs/releases/2.23.15.md +7 -0
  14. package/docs/releases/2.23.16.md +7 -0
  15. package/docs/releases/2.23.17.md +7 -0
  16. package/docs/releases/2.23.18.md +9 -0
  17. package/docs/releases/2.23.19.md +9 -0
  18. package/docs/releases/2.23.20.md +11 -0
  19. package/docs/releases/2.23.21.md +7 -0
  20. package/docs/releases/2.23.22.md +5 -0
  21. package/docs/releases/2.23.23.md +9 -0
  22. package/docs/releases/2.23.24.md +11 -0
  23. package/docs/releases/2.23.25.md +5 -0
  24. package/docs/releases/2.23.26.md +7 -0
  25. package/docs/releases/2.23.27.md +7 -0
  26. package/docs/releases/2.23.28.md +11 -0
  27. package/docs/releases/2.23.29.md +10 -0
  28. package/docs/releases/2.23.30.md +10 -0
  29. package/docs/releases/2.23.31.md +11 -0
  30. package/docs/releases/2.23.32.md +11 -0
  31. package/docs/releases/2.23.33.md +11 -0
  32. package/docs/releases/2.23.34.md +9 -0
  33. package/docs/releases/2.23.35.md +3 -0
  34. package/docs/releases/2.23.36.md +11 -0
  35. package/docs/releases/2.23.37.md +3 -0
  36. package/docs/releases/2.23.38.md +8 -0
  37. package/docs/releases/2.23.39.md +5 -0
  38. package/docs/releases/2.23.40.md +5 -0
  39. package/docs/tool-entry-compatibility.md +2 -2
  40. package/lib/agent-runtime.d.ts +2 -0
  41. package/lib/agent-runtime.d.ts.map +1 -1
  42. package/lib/agent-runtime.js +105 -29
  43. package/lib/agent-runtime.js.map +1 -1
  44. package/lib/api.d.ts.map +1 -1
  45. package/lib/api.js +22 -1
  46. package/lib/api.js.map +1 -1
  47. package/lib/attachments/delivery-receipt.d.ts +7 -0
  48. package/lib/attachments/delivery-receipt.d.ts.map +1 -0
  49. package/lib/attachments/delivery-receipt.js +22 -0
  50. package/lib/attachments/delivery-receipt.js.map +1 -0
  51. package/lib/attachments/reply-document.d.ts +41 -0
  52. package/lib/attachments/reply-document.d.ts.map +1 -0
  53. package/lib/attachments/reply-document.js +32 -0
  54. package/lib/attachments/reply-document.js.map +1 -0
  55. package/lib/attachments/tool.d.ts +1 -1
  56. package/lib/attachments/tool.d.ts.map +1 -1
  57. package/lib/attachments/tool.js +45 -8
  58. package/lib/attachments/tool.js.map +1 -1
  59. package/lib/channel-message.d.ts +2 -0
  60. package/lib/channel-message.d.ts.map +1 -1
  61. package/lib/channel-message.js.map +1 -1
  62. package/lib/channels/authored-progress.d.ts +2 -1
  63. package/lib/channels/authored-progress.d.ts.map +1 -1
  64. package/lib/channels/authored-progress.js +4 -2
  65. package/lib/channels/authored-progress.js.map +1 -1
  66. package/lib/channels/delivery-policy.d.ts +1 -0
  67. package/lib/channels/delivery-policy.d.ts.map +1 -1
  68. package/lib/channels/delivery-policy.js +22 -4
  69. package/lib/channels/delivery-policy.js.map +1 -1
  70. package/lib/channels/direct/transport.d.ts +2 -0
  71. package/lib/channels/direct/transport.d.ts.map +1 -1
  72. package/lib/channels/manager.d.ts.map +1 -1
  73. package/lib/channels/manager.js +54 -9
  74. package/lib/channels/manager.js.map +1 -1
  75. package/lib/channels/outbound-media.js +1 -1
  76. package/lib/channels/outbound-media.js.map +1 -1
  77. package/lib/channels/qq/action-catalog.d.ts.map +1 -1
  78. package/lib/channels/qq/action-catalog.js +111 -0
  79. package/lib/channels/qq/action-catalog.js.map +1 -1
  80. package/lib/channels/qq/actions.d.ts +1 -1
  81. package/lib/channels/qq/actions.d.ts.map +1 -1
  82. package/lib/channels/qq/actions.js +81 -10
  83. package/lib/channels/qq/actions.js.map +1 -1
  84. package/lib/channels/qq/authority.d.ts +1 -1
  85. package/lib/channels/qq/authority.d.ts.map +1 -1
  86. package/lib/channels/qq/authority.js +7 -2
  87. package/lib/channels/qq/authority.js.map +1 -1
  88. package/lib/channels/qq/autonomy.d.ts.map +1 -1
  89. package/lib/channels/qq/autonomy.js +3 -0
  90. package/lib/channels/qq/autonomy.js.map +1 -1
  91. package/lib/channels/qq/chat-actions.d.ts +6 -0
  92. package/lib/channels/qq/chat-actions.d.ts.map +1 -0
  93. package/lib/channels/qq/chat-actions.js +11 -0
  94. package/lib/channels/qq/chat-actions.js.map +1 -0
  95. package/lib/channels/qq/message.js +1 -1
  96. package/lib/channels/qq/message.js.map +1 -1
  97. package/lib/channels/qq/quote.d.ts +14 -0
  98. package/lib/channels/qq/quote.d.ts.map +1 -0
  99. package/lib/channels/qq/quote.js +69 -0
  100. package/lib/channels/qq/quote.js.map +1 -0
  101. package/lib/channels/qq/reply-tool.d.ts.map +1 -1
  102. package/lib/channels/qq/reply-tool.js +8 -4
  103. package/lib/channels/qq/reply-tool.js.map +1 -1
  104. package/lib/channels/qq/sticker-adapter.d.ts.map +1 -1
  105. package/lib/channels/qq/sticker-adapter.js +9 -11
  106. package/lib/channels/qq/sticker-adapter.js.map +1 -1
  107. package/lib/channels/weixin/connect.d.ts.map +1 -1
  108. package/lib/character/activity-tool.d.ts +3 -0
  109. package/lib/character/activity-tool.d.ts.map +1 -1
  110. package/lib/character/activity-tool.js +13 -8
  111. package/lib/character/activity-tool.js.map +1 -1
  112. package/lib/character/affection-tool.d.ts +4 -0
  113. package/lib/character/affection-tool.d.ts.map +1 -0
  114. package/lib/character/affection-tool.js +61 -0
  115. package/lib/character/affection-tool.js.map +1 -0
  116. package/lib/character/affection.d.ts +41 -16
  117. package/lib/character/affection.d.ts.map +1 -1
  118. package/lib/character/affection.js +35 -20
  119. package/lib/character/affection.js.map +1 -1
  120. package/lib/character/conversation-behavior.d.ts +8 -7
  121. package/lib/character/conversation-behavior.d.ts.map +1 -1
  122. package/lib/character/conversation-behavior.js +29 -39
  123. package/lib/character/conversation-behavior.js.map +1 -1
  124. package/lib/character/domain.js +1 -1
  125. package/lib/character/domain.js.map +1 -1
  126. package/lib/character/fatigue.d.ts +1 -1
  127. package/lib/character/fatigue.js +1 -1
  128. package/lib/character/idle-contact.d.ts +22 -1
  129. package/lib/character/idle-contact.d.ts.map +1 -1
  130. package/lib/character/idle-contact.js +72 -21
  131. package/lib/character/idle-contact.js.map +1 -1
  132. package/lib/character/post-reply.d.ts +10 -4
  133. package/lib/character/post-reply.d.ts.map +1 -1
  134. package/lib/character/post-reply.js +56 -12
  135. package/lib/character/post-reply.js.map +1 -1
  136. package/lib/character/prompt-projection.d.ts +10 -0
  137. package/lib/character/prompt-projection.d.ts.map +1 -0
  138. package/lib/character/prompt-projection.js +42 -0
  139. package/lib/character/prompt-projection.js.map +1 -0
  140. package/lib/character/sleep-service.d.ts +1 -1
  141. package/lib/character/sleep-service.d.ts.map +1 -1
  142. package/lib/character/sleep-service.js +5 -3
  143. package/lib/character/sleep-service.js.map +1 -1
  144. package/lib/character/sleep.d.ts +3 -1
  145. package/lib/character/sleep.d.ts.map +1 -1
  146. package/lib/character/sleep.js +4 -2
  147. package/lib/character/sleep.js.map +1 -1
  148. package/lib/character/state-policy.d.ts.map +1 -1
  149. package/lib/character/state-policy.js +1 -0
  150. package/lib/character/state-policy.js.map +1 -1
  151. package/lib/chat/action-obligation.d.ts +17 -0
  152. package/lib/chat/action-obligation.d.ts.map +1 -0
  153. package/lib/chat/action-obligation.js +109 -0
  154. package/lib/chat/action-obligation.js.map +1 -0
  155. package/lib/chat/agreements.d.ts +21 -0
  156. package/lib/chat/agreements.d.ts.map +1 -0
  157. package/lib/chat/agreements.js +120 -0
  158. package/lib/chat/agreements.js.map +1 -0
  159. package/lib/chat/attachment-reference.d.ts +4 -0
  160. package/lib/chat/attachment-reference.d.ts.map +1 -0
  161. package/lib/chat/attachment-reference.js +13 -0
  162. package/lib/chat/attachment-reference.js.map +1 -0
  163. package/lib/chat/context-selection.d.ts +10 -0
  164. package/lib/chat/context-selection.d.ts.map +1 -0
  165. package/lib/chat/context-selection.js +39 -0
  166. package/lib/chat/context-selection.js.map +1 -0
  167. package/lib/chat/conversation.d.ts.map +1 -1
  168. package/lib/chat/conversation.js +4 -0
  169. package/lib/chat/conversation.js.map +1 -1
  170. package/lib/chat/live-speech.d.ts +18 -0
  171. package/lib/chat/live-speech.d.ts.map +1 -0
  172. package/lib/chat/live-speech.js +137 -0
  173. package/lib/chat/live-speech.js.map +1 -0
  174. package/lib/chat/protocol.d.ts +23 -0
  175. package/lib/chat/protocol.d.ts.map +1 -1
  176. package/lib/chat/protocol.js +31 -1
  177. package/lib/chat/protocol.js.map +1 -1
  178. package/lib/chat/reply-completion.d.ts +27 -0
  179. package/lib/chat/reply-completion.d.ts.map +1 -0
  180. package/lib/chat/reply-completion.js +123 -0
  181. package/lib/chat/reply-completion.js.map +1 -0
  182. package/lib/chat/reply-continuity.d.ts +20 -0
  183. package/lib/chat/reply-continuity.d.ts.map +1 -0
  184. package/lib/chat/reply-continuity.js +97 -0
  185. package/lib/chat/reply-continuity.js.map +1 -0
  186. package/lib/chat/short-expression.d.ts +6 -0
  187. package/lib/chat/short-expression.d.ts.map +1 -0
  188. package/lib/chat/short-expression.js +24 -0
  189. package/lib/chat/short-expression.js.map +1 -0
  190. package/lib/chat/sticker-adapter.d.ts +1 -1
  191. package/lib/chat/sticker-adapter.d.ts.map +1 -1
  192. package/lib/chat/tools.d.ts.map +1 -1
  193. package/lib/chat/tools.js +79 -10
  194. package/lib/chat/tools.js.map +1 -1
  195. package/lib/chat/verified-calculation.d.ts +48 -0
  196. package/lib/chat/verified-calculation.d.ts.map +1 -0
  197. package/lib/chat/verified-calculation.js +46 -0
  198. package/lib/chat/verified-calculation.js.map +1 -0
  199. package/lib/chat/work-expression.d.ts +84 -0
  200. package/lib/chat/work-expression.d.ts.map +1 -0
  201. package/lib/chat/work-expression.js +296 -0
  202. package/lib/chat/work-expression.js.map +1 -0
  203. package/lib/client-api.d.ts +2 -1
  204. package/lib/client-api.d.ts.map +1 -1
  205. package/lib/client-api.js.map +1 -1
  206. package/lib/client.js +2243 -1716
  207. package/lib/client.js.map +4 -4
  208. package/lib/collaboration/composition.d.ts.map +1 -1
  209. package/lib/collaboration/composition.js +23 -54
  210. package/lib/collaboration/composition.js.map +1 -1
  211. package/lib/collaboration/tool-discovery.d.ts +4 -2
  212. package/lib/collaboration/tool-discovery.d.ts.map +1 -1
  213. package/lib/collaboration/tool-discovery.js +55 -26
  214. package/lib/collaboration/tool-discovery.js.map +1 -1
  215. package/lib/collaboration/workflow-protocols.d.ts +5 -0
  216. package/lib/collaboration/workflow-protocols.d.ts.map +1 -0
  217. package/lib/collaboration/workflow-protocols.js +40 -0
  218. package/lib/collaboration/workflow-protocols.js.map +1 -0
  219. package/lib/companions/identity-tool.d.ts +1 -1
  220. package/lib/companions/identity-tool.d.ts.map +1 -1
  221. package/lib/companions/identity-tool.js +32 -6
  222. package/lib/companions/identity-tool.js.map +1 -1
  223. package/lib/companions/identity.d.ts.map +1 -1
  224. package/lib/companions/identity.js +10 -0
  225. package/lib/companions/identity.js.map +1 -1
  226. package/lib/companions/persona-refinement.d.ts +11 -0
  227. package/lib/companions/persona-refinement.d.ts.map +1 -0
  228. package/lib/companions/persona-refinement.js +49 -0
  229. package/lib/companions/persona-refinement.js.map +1 -0
  230. package/lib/domain.d.ts +2 -0
  231. package/lib/domain.d.ts.map +1 -1
  232. package/lib/domain.js.map +1 -1
  233. package/lib/execution/domain.d.ts +1 -1
  234. package/lib/execution/domain.d.ts.map +1 -1
  235. package/lib/execution/reply-progress.js +2 -2
  236. package/lib/execution/reply-progress.js.map +1 -1
  237. package/lib/execution/service.d.ts +3 -0
  238. package/lib/execution/service.d.ts.map +1 -1
  239. package/lib/execution/service.js +7 -5
  240. package/lib/execution/service.js.map +1 -1
  241. package/lib/execution/task-preamble.d.ts +7 -3
  242. package/lib/execution/task-preamble.d.ts.map +1 -1
  243. package/lib/execution/task-preamble.js +36 -10
  244. package/lib/execution/task-preamble.js.map +1 -1
  245. package/lib/execution/work-tool.d.ts +5 -0
  246. package/lib/execution/work-tool.d.ts.map +1 -0
  247. package/lib/execution/work-tool.js +152 -0
  248. package/lib/execution/work-tool.js.map +1 -0
  249. package/lib/index.d.ts.map +1 -1
  250. package/lib/index.js +5 -2
  251. package/lib/index.js.map +1 -1
  252. package/lib/rolling-context.d.ts.map +1 -1
  253. package/lib/rolling-context.js +4 -2
  254. package/lib/rolling-context.js.map +1 -1
  255. package/lib/scheduler/final-reply.d.ts +1 -0
  256. package/lib/scheduler/final-reply.d.ts.map +1 -1
  257. package/lib/skills/service.js +1 -1
  258. package/lib/skills/service.js.map +1 -1
  259. package/lib/store.d.ts.map +1 -1
  260. package/lib/store.js +11 -0
  261. package/lib/store.js.map +1 -1
  262. package/lib/ui/affection-panel.d.ts.map +1 -1
  263. package/lib/ui/affection-panel.js +1 -1
  264. package/lib/ui/affection-panel.js.map +1 -1
  265. package/lib/ui/capability-editor.js +1 -1
  266. package/lib/ui/capability-editor.js.map +1 -1
  267. package/lib/ui/character-editor.d.ts +1 -1
  268. package/lib/ui/character-editor.d.ts.map +1 -1
  269. package/lib/ui/character-editor.js +6 -5
  270. package/lib/ui/character-editor.js.map +1 -1
  271. package/lib/ui/companion-vitals.js +1 -1
  272. package/lib/ui/companion-vitals.js.map +1 -1
  273. package/lib/ui/identity-editor.d.ts.map +1 -1
  274. package/lib/ui/identity-editor.js +8 -1
  275. package/lib/ui/identity-editor.js.map +1 -1
  276. package/lib/ui/idle-contact-editor.d.ts.map +1 -1
  277. package/lib/ui/idle-contact-editor.js +1 -1
  278. package/lib/ui/idle-contact-editor.js.map +1 -1
  279. package/lib/ui/memory/automation-settings.js +1 -1
  280. package/lib/ui/memory/automation-settings.js.map +1 -1
  281. package/lib/ui/push-draft.d.ts +1 -1
  282. package/lib/ui/qq-capability-settings.d.ts.map +1 -1
  283. package/lib/ui/qq-capability-settings.js +2 -1
  284. package/lib/ui/qq-capability-settings.js.map +1 -1
  285. package/lib/ui/qq-channel-settings.d.ts.map +1 -1
  286. package/lib/ui/qq-channel-settings.js +5 -3
  287. package/lib/ui/qq-channel-settings.js.map +1 -1
  288. package/lib/ui/qq-identity-binding.js +1 -1
  289. package/lib/ui/qq-identity-binding.js.map +1 -1
  290. package/package.json +38 -2
@@ -0,0 +1,137 @@
1
+ import { checkShortExpression } from './short-expression.js';
2
+ import { hasTaskPreamble } from '../execution/task-preamble.js';
3
+ import { isIdleContactNotice } from '../character/idle-contact.js';
4
+ import { isInternalTaskNotice, isRequirementDeliveryReceipt } from '../channels/delivery-policy.js';
5
+ import { assertChatImageDelivery } from './attachment-reference.js';
6
+ import { chatReplyFromEvent } from './protocol.js';
7
+ function currentInput(events) {
8
+ for (const e of [...events].reverse()) {
9
+ if (e.type === 'turn/start')
10
+ return;
11
+ if (e.type !== 'user/message')
12
+ continue;
13
+ if (e.data.source.kind === 'user')
14
+ return e.data.id;
15
+ if (isIdleContactNotice(e) || isInternalTaskNotice(e) && !isRequirementDeliveryReceipt(e))
16
+ return;
17
+ }
18
+ }
19
+ /** Successful speech after the latest input permits an explicit, silent end. */
20
+ export function hasCurrentSpeech(events) {
21
+ for (const e of [...events].reverse()) {
22
+ if (e.type === 'turn/start' || e.type === 'user/message' && (e.data.source.kind === 'user' || isIdleContactNotice(e) || isInternalTaskNotice(e) && !isRequirementDeliveryReceipt(e)))
23
+ return false;
24
+ const reply = chatReplyFromEvent(e);
25
+ if (reply?.intermediate && reply.delivered && reply.inputMessageId === currentInput(events))
26
+ return !reply.taskPreamble;
27
+ }
28
+ return false;
29
+ }
30
+ function validateSpeechText(raw, expanded) {
31
+ if (typeof raw !== 'string' || !raw.trim() || raw.length > (expanded ? 1200 : 180) || !expanded && /[\r\n]/.test(raw))
32
+ throw Error('这里只发送一条简短的聊天消息(最多 180 字,不换行);详细内容使用最终回复或附件');
33
+ assertChatImageDelivery(raw.trim());
34
+ }
35
+ /** Per active channel turn. Serial sends, sticky unknown failures, no background continuation. */
36
+ export class LiveSpeech {
37
+ events;
38
+ send;
39
+ active;
40
+ pending = Promise.resolve();
41
+ failed = false;
42
+ count = 0;
43
+ sent = new Map();
44
+ constructor(events, send, active) {
45
+ this.events = events;
46
+ this.send = send;
47
+ this.active = active;
48
+ }
49
+ say(raw, signal, expanded = false, task = false) {
50
+ const input = currentInput(this.events());
51
+ if (!input || !this.active())
52
+ return Promise.reject(Error('只能在当前用户聊天中接话;不能用于闲时活动或内部任务'));
53
+ try {
54
+ validateSpeechText(raw, expanded);
55
+ }
56
+ catch (error) {
57
+ return Promise.reject(error);
58
+ }
59
+ const text = raw.trim();
60
+ const key = input + '\0' + text, previous = this.sent.get(key);
61
+ if (previous)
62
+ return previous;
63
+ if (this.count >= (task ? 7 : 6))
64
+ return Promise.reject(Error('本轮中途接话已达上限,请用 partner_chat_reply 结束,不继续自说自话'));
65
+ this.count++;
66
+ const job = this.pending.then(async () => {
67
+ signal.throwIfAborted();
68
+ if (this.failed || !this.active() || currentInput(this.events()) !== input)
69
+ throw Error('输入或发送状态已变化,旧接话未发送;先处理新消息,不重试未知发送');
70
+ await this.send(text);
71
+ });
72
+ this.sent.set(key, job);
73
+ this.pending = job.catch(() => { this.failed = true; });
74
+ return job;
75
+ }
76
+ }
77
+ export function installLiveSpeech(agent, send, route, chatEnabled = () => true, short = () => true) {
78
+ const speech = new LiveSpeech(() => agent.session.snapshotEvents(), send, () => !!route());
79
+ const taskSends = new Map();
80
+ return agent.ctx.tools.register({
81
+ name: 'partner_chat_say',
82
+ description: '当前私聊统一说话入口:立即发送 text,确认送达后继续本轮。每一句都直接按当前角色、关系和聊天节奏写,不展示思考过程,不切换成客服、主持人或任务播报。普通接话省略 beforeTools;实际执行工具或长任务前,用同一入口、beforeTools:true,按人格简短说准备做什么,并用 expectedTools 列出本轮承诺实际调用的具体工具名(必须是当前已注册的真实名称,未知时先查目录,不能猜别名或填目录入口 partner_tools);生图并发送应列实际选择的生图入口(image_gen.imagegen 或 generate_image)及 partner_send_attachment。角色扮演中的叙事动作不需要伪造工具任务;只登记真实外部操作,不为叙事动作额外委派工作。成功后再工作;这句话就是前置回应,不再另外重复。同轮后续新增真实动作时,再用 beforeTools:true 与 expectedTools 登记;程序保留新增动作而不重复发前置回应,普通补话仍可单独发送。尚未执行用将要做的语气,不虚构完成或无权限。自然想补一句、改口或工作后有新话时可再次调用,不强制连发,不把长解释分批倾倒。收到新消息先接新消息。说完用 partner_chat_reply 结束,最终文字也保持同一人物声音;当前输入后已有普通接话送达且没有新话可 messages:[],仅有任务前告知不能代替完成答复。',
83
+ parameters: { type: 'object', properties: { expectedTools: { type: 'array', minItems: 1, maxItems: 8, uniqueItems: true, items: { type: 'string', maxLength: 100, pattern: '^[a-zA-Z0-9_.:-]+$' }, description: 'beforeTools=true 时必填。承诺本轮实际执行的具体工具名,含必要交付;目录查询不算执行。普通接话不填。' }, text: { type: 'string', minLength: 1, maxLength: 1200 }, beforeTools: { type: 'boolean', description: '这句话是在告知即将实际执行的动作时设为 true;普通闲聊不设置。必须等本次发送成功再执行任务。' }, inlineDetails: { type: 'boolean', description: '仅用户明确要求详细内容、原文或完整任务计划时使用;普通接话不借此展开长文。' } }, required: ['text'], additionalProperties: false },
84
+ output: { schema: { type: 'object' }, render: (_args, value) => [{ type: 'text', text: value.actionsAdded ? '新增动作已登记,没有重复发送前置回应;继续执行新增动作,已经完成的操作不要重做。' : value.alreadyAnnounced ? '动作已告知,本次没有重复发送;继续执行任务。' : '这句话已发送。继续按同一人物口吻接话或执行已告知的操作;完成后用 partner_chat_reply 结束,不重复已说内容。仅任务前告知不能代替任务最终答复。' }], presentationMeta: (_args, value) => value },
85
+ presentCall: () => ({ card: 'generic', title: '接话' }),
86
+ async execute(raw, exec) {
87
+ const originRouteId = route();
88
+ if (!originRouteId)
89
+ throw Error('当前聊天目标已失效');
90
+ const inputMessageId = currentInput(agent.session.snapshotEvents());
91
+ const { text, beforeTools, inlineDetails, expectedTools } = raw;
92
+ exec.signal.throwIfAborted();
93
+ if (!beforeTools && !chatEnabled())
94
+ throw Error('连续接话未开启;任务动作告知使用 beforeTools:true,普通内容用最终回复');
95
+ if (beforeTools && (!Array.isArray(expectedTools) || !expectedTools.length || expectedTools.length > 8 || expectedTools.some(n => typeof n !== 'string' || n.length > 100 || !/^[a-zA-Z0-9_.:-]+$/.test(n) || ['partner_tools', 'partner_chat_say', 'partner_chat_reply', 'partner_chat_progress'].includes(n))))
96
+ throw Error('动作告知尚未发送:beforeTools=true 时用 expectedTools 列出准备实际调用的具体工具名;生图并发送填实际生图工具名和 partner_send_attachment,不填 partner_tools。');
97
+ if (beforeTools && inputMessageId) {
98
+ // Validate exact registered names before speaking or recording obligations. No guessed aliases.
99
+ const unknown = expectedTools.filter(name => !agent.ctx.tools.get(name, agent));
100
+ if (unknown.length)
101
+ throw Error('动作告知尚未发送或登记:工具名未在当前上下文注册:' + unknown.join('、') + '。先通过 partner_tools list/describe 核实具体名称,再重新告知;不要猜测别名,也不要把本检查发给用户。');
102
+ const previous = taskSends.get(inputMessageId);
103
+ if (previous)
104
+ await previous.job;
105
+ exec.signal.throwIfAborted();
106
+ if (currentInput(agent.session.snapshotEvents()) !== inputMessageId || route() !== originRouteId)
107
+ throw Error('当前输入或渠道已变化,旧动作未登记');
108
+ const known = new Set(taskSends.get(inputMessageId)?.names ?? []);
109
+ for (const event of agent.session.snapshotEvents()) {
110
+ const receipt = chatReplyFromEvent(event);
111
+ if (receipt?.delivered && receipt.taskPreamble && receipt.inputMessageId === inputMessageId)
112
+ for (const name of receipt.expectedTools ?? [])
113
+ known.add(name);
114
+ }
115
+ const added = [...new Set(expectedTools)].filter(name => !known.has(name));
116
+ if (!added.length)
117
+ return { alreadyAnnounced: true };
118
+ if (previous || hasTaskPreamble(agent.session.snapshotEvents())) {
119
+ taskSends.set(inputMessageId, { names: new Set([...known, ...added]), job: Promise.resolve() });
120
+ return { kind: 'partner-chat-v1', parts: [], delivered: true, deliveryKind: 'text', intermediate: true, taskPreamble: true, expectedTools: added, inputMessageId, originRouteId, alreadyAnnounced: true, actionsAdded: true };
121
+ }
122
+ checkShortExpression(agent, agent.session.snapshotEvents(), [text], 'speech', short(), inlineDetails === true);
123
+ // Local validation has no delivery side effect; do not cache its rejection as a send.
124
+ validateSpeechText(text, !short() || inlineDetails === true);
125
+ const job = speech.say(text, exec.signal, !short() || inlineDetails === true, true);
126
+ taskSends.set(inputMessageId, { names: new Set(added), job });
127
+ await job;
128
+ }
129
+ else {
130
+ checkShortExpression(agent, agent.session.snapshotEvents(), [text], 'speech', short(), inlineDetails === true);
131
+ await speech.say(text, exec.signal, inlineDetails === true);
132
+ }
133
+ return { kind: 'partner-chat-v1', parts: [], delivered: true, deliveryKind: 'text', intermediate: true, ...(beforeTools ? { taskPreamble: true, expectedTools: [...expectedTools] } : {}), inputMessageId, spokenText: text.trim(), originRouteId };
134
+ },
135
+ });
136
+ }
137
+ //# sourceMappingURL=live-speech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-speech.js","sourceRoot":"","sources":["../../src/chat/live-speech.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,14 @@ export interface ChatReply {
17
17
  kind: 'partner-chat-v1';
18
18
  parts: ChatPart[];
19
19
  silent?: boolean;
20
+ intermediate?: boolean;
21
+ taskPreamble?: boolean;
22
+ expectedTools?: string[];
23
+ taskDisposition?: 'blocked';
24
+ inputMessageId?: string;
25
+ deliveryKind?: 'text';
26
+ delivered?: boolean;
27
+ spokenText?: string;
20
28
  originRouteId?: string | null;
21
29
  }
22
30
  export declare function chatReplyFromEvent(event: SessionEvent): ChatReply | undefined;
@@ -48,4 +56,19 @@ export declare function withChatCompanionText(input: Array<{
48
56
  } | {
49
57
  stickerId: string;
50
58
  }>;
59
+ /** Only idle chat's unstructured, short paragraphs get a delivery fallback.
60
+ * Explicit tool parts, documents and attachment replies keep authored boundaries.
61
+ * Call before persisting the delivery so retries retain stable part indexes.
62
+ */
63
+ export declare function segmentIdleChatReply(reply: PartnerReply, enabled: boolean): PartnerReply;
64
+ /** Normalize only a single short text item; keep explicit multi-bubble order and the 8-part limit. */
65
+ export declare function segmentChatInput(input: Array<{
66
+ text: string;
67
+ } | {
68
+ stickerId: string;
69
+ }>, enabled: boolean): Array<{
70
+ text: string;
71
+ } | {
72
+ stickerId: string;
73
+ }>;
51
74
  //# sourceMappingURL=protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/chat/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,WAAW,EAAC,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpF,MAAM,MAAM,QAAQ,GAAG;IAAC,IAAI,EAAC,OAAO,CAAC;IAAA,KAAK,EAAC,WAAW,CAAA;CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,yBAAyB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC/K,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,CAAC,EAAC,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACzH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAO7E;AACD,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,IAAI,EAAC,OAAO,CAAC;IAAA,UAAU,EAAC,yBAAyB,CAAA;CAAC,GAAG;IAAC,IAAI,EAAC,OAAO,CAAC;IAAA,KAAK,EAAC,WAAW,CAAA;CAAC,CAAC,CAGjL;AACD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,CAkBtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,CAsB9L"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/chat/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,WAAW,EAAC,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpF,MAAM,MAAM,QAAQ,GAAG;IAAC,IAAI,EAAC,OAAO,CAAC;IAAA,KAAK,EAAC,WAAW,CAAA;CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,yBAAyB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC/K,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,CAAC,EAAC,OAAO,CAAC;IAAC,YAAY,CAAC,EAAC,OAAO,CAAC;IAAC,YAAY,CAAC,EAAC,OAAO,CAAC;IAAC,aAAa,CAAC,EAAC,MAAM,EAAE,CAAC;IAAC,eAAe,CAAC,EAAC,SAAS,CAAC;IAAC,cAAc,CAAC,EAAC,MAAM,CAAC;IAAC,YAAY,CAAC,EAAC,MAAM,CAAC;IAAC,SAAS,CAAC,EAAC,OAAO,CAAC;IAAC,UAAU,CAAC,EAAC,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAClT,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAO7E;AACD,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,IAAI,EAAC,OAAO,CAAC;IAAA,UAAU,EAAC,yBAAyB,CAAA;CAAC,GAAG;IAAC,IAAI,EAAC,OAAO,CAAC;IAAA,KAAK,EAAC,WAAW,CAAA;CAAC,CAAC,CAGjL;AACD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,CAkBtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,CAsB9L;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY,CAKxF;AASD,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAC,MAAM,CAAA;CAAC,CAAC,CAM9I"}
@@ -5,7 +5,7 @@ export function chatReplyFromEvent(event) {
5
5
  if (!event.data || (event.type === 'tool/result' ? event.data.message?.isError : event.data.isError))
6
6
  return;
7
7
  const value = event.data.meta;
8
- if (value?.kind !== 'partner-chat-v1' || !Array.isArray(value.parts) || (!value.parts.length && value.silent !== true) || value.parts.length > 8)
8
+ if (value?.kind !== 'partner-chat-v1' || !Array.isArray(value.parts) || (!value.parts.length && value.silent !== true && !(value.delivered === true && typeof value.originRouteId === 'string' && value.originRouteId.length > 0)) || value.parts.length > 8)
9
9
  return;
10
10
  if (!value.parts.every(p => p && typeof p === 'object' && (p.type === 'text' ? typeof p.text === 'string' && !!p.text.trim() : p.type === 'emoji' ? validNativeEmoji(p.emoji) : p.type === 'image' && p.attachment?.kind === 'image' && typeof p.url === 'string' && p.url.startsWith('/') && !p.url.startsWith('//') && typeof p.label === 'string')))
11
11
  return;
@@ -87,4 +87,34 @@ export function withChatCompanionText(input, events, callId) {
87
87
  }
88
88
  return input;
89
89
  }
90
+ /** Only idle chat's unstructured, short paragraphs get a delivery fallback.
91
+ * Explicit tool parts, documents and attachment replies keep authored boundaries.
92
+ * Call before persisting the delivery so retries retain stable part indexes.
93
+ */
94
+ export function segmentIdleChatReply(reply, enabled) {
95
+ if (!enabled || reply.chatParts !== undefined || reply.attachments.length || reply.text.length > 600)
96
+ return reply;
97
+ const paragraphs = shortChatLines(reply.text);
98
+ if (!paragraphs)
99
+ return reply;
100
+ return { ...reply, chatParts: paragraphs.map(text => ({ type: 'text', text })) };
101
+ }
102
+ function shortChatLines(text) {
103
+ if (text.length > 600 || /[`~<>|]/.test(text) || /^(?: {4}|\t|\s*(?:#{1,6}\s|[-*+]\s|\d+[.)、]\s|>))/m.test(text))
104
+ return;
105
+ const lines = text.trim().split(/\r?\n/).map(p => p.trim()).filter(Boolean);
106
+ if (lines.length < 2 || lines.length > 8 || lines.some(p => p.length > 200))
107
+ return;
108
+ return lines;
109
+ }
110
+ /** Normalize only a single short text item; keep explicit multi-bubble order and the 8-part limit. */
111
+ export function segmentChatInput(input, enabled) {
112
+ if (!enabled || input.filter(p => 'text' in p).length !== 1)
113
+ return input;
114
+ const text = input.find(p => 'text' in p);
115
+ const lines = shortChatLines(text.text);
116
+ if (!lines || input.length - 1 + lines.length > 8)
117
+ return input;
118
+ return input.flatMap(p => 'text' in p ? lines.map(text => ({ text })) : [p]);
119
+ }
90
120
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/chat/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/chat/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Agent } from '@deepseek-ai/dsh-agent';
2
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
3
+ export interface ReplyCompletionState {
4
+ userId: string;
5
+ phase: 'complete' | 'execute' | 'settle';
6
+ files: string[];
7
+ deliveries: string[];
8
+ }
9
+ /** Evidence for the latest user input in this turn, never a semantic guess from prose. */
10
+ export declare function replyCompletionState(events: readonly SessionEvent[], inspectOnly?: boolean): ReplyCompletionState | undefined;
11
+ export declare const INCOMPLETE_REPLY = "\u672C\u6B21\u8BF7\u6C42\u672A\u5B8C\u6210\uFF1A\u6A21\u578B\u8FDE\u7EED\u672A\u5B8C\u6210\u7B54\u590D\u6216\u5DF2\u544A\u77E5\u7684\u52A8\u4F5C\u3002\u5DF2\u6267\u884C\u7684\u64CD\u4F5C\u4E0D\u4F1A\u81EA\u52A8\u91CD\u505A\uFF0C\u8BF7\u67E5\u770B\u672C\u6B21\u6267\u884C\u8BB0\u5F55\u540E\u518D\u51B3\u5B9A\u662F\u5426\u91CD\u8BD5\u3002";
12
+ /** Same-turn recovery with a bounded request budget and a settlement-only tool gate. */
13
+ export declare class ReplyCompletionGuard {
14
+ private readonly agent;
15
+ private readonly active;
16
+ private userId;
17
+ private attempts;
18
+ private settling;
19
+ failed: boolean;
20
+ constructor(agent: Agent, active: () => boolean);
21
+ stop: ({ agent, signal }: {
22
+ agent: Agent;
23
+ signal: AbortSignal;
24
+ }) => void;
25
+ deny(name: string, args: unknown): string | undefined;
26
+ }
27
+ //# sourceMappingURL=reply-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-completion.d.ts","sourceRoot":"","sources":["../../src/chat/reply-completion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAkB5D,MAAM,WAAW,oBAAoB;IAAG,MAAM,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,UAAU,GAAC,SAAS,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,EAAE,CAAC;IAAC,UAAU,EAAC,MAAM,EAAE,CAAA;CAAE;AACjI,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,MAAM,EAAC,SAAS,YAAY,EAAE,EAAE,WAAW,UAAM,GAAE,oBAAoB,GAAC,SAAS,CA6BrH;AACD,eAAO,MAAM,gBAAgB,qVAA2D,CAAA;AACxF,wFAAwF;AACxF,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAO,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJhE,OAAO,CAAC,MAAM,CAAG;IACjB,OAAO,CAAC,QAAQ,CAAE;IAClB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,MAAM,UAAM;gBACiB,KAAK,EAAC,KAAK,EAAkB,MAAM,EAAC,MAAI,OAAO;IAC5E,IAAI,GAAE,mBAAe;QAAC,KAAK,EAAC,KAAK,CAAC;QAAA,MAAM,EAAC,WAAW,CAAA;KAAC,KAAE,IAAI,CAW1D;IACD,IAAI,CAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,GAAE,MAAM,GAAC,SAAS;CAahD"}
@@ -0,0 +1,123 @@
1
+ import { pendingActions, pendingActionNotice } from './action-obligation.js';
2
+ import { deliveredAttachment } from '../attachments/delivery-receipt.js';
3
+ import { createUserMessage } from '@deepseek-ai/dsh-llm';
4
+ import { chatReplyFromEvent } from './protocol.js';
5
+ import { isInternalTaskNotice } from '../channels/delivery-policy.js';
6
+ import { isIdleContactNotice } from '../character/idle-contact.js';
7
+ function object(value) {
8
+ try {
9
+ const v = typeof value === 'string' ? JSON.parse(value) : value;
10
+ return v && typeof v === 'object' && !Array.isArray(v) ? v : undefined;
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ function call(name, args) {
17
+ const input = object(args) ?? {};
18
+ if (name === 'partner_tools' && input.action === 'call' && typeof input.name === 'string')
19
+ return { name: input.name, args: object(input.argumentsJson) ?? {} };
20
+ return { name, args: input };
21
+ }
22
+ function discovery(name, args) {
23
+ return name === 'partner_tools' && ['list', 'describe', 'load', 'unload'].includes(args.action);
24
+ }
25
+ const replyControl = new Set(['partner_chat_progress', 'partner_chat_say', 'partner_chat_reply', 'partner_agreement', 'partner_channel_access', 'partner_stickers']);
26
+ /** Evidence for the latest user input in this turn, never a semantic guess from prose. */
27
+ export function replyCompletionState(events, inspectOnly = false) {
28
+ const boundary = [...events].reverse().find(e => e.type === 'turn/start');
29
+ if (!boundary)
30
+ return;
31
+ const turn = events.slice(events.indexOf(boundary) + 1);
32
+ const origin = [...turn].reverse().find(e => e.type === 'user/message' && (e.data.source.kind === 'user' || isInternalTaskNotice(e) || isIdleContactNotice(e)));
33
+ if (origin?.type !== 'user/message' || origin.data.source.kind !== 'user')
34
+ return;
35
+ const tail = turn.slice(turn.indexOf(origin) + 1);
36
+ const state = { userId: origin.data.id, phase: 'execute', files: [], deliveries: [] };
37
+ const last = [...tail].reverse().find(e => e.type === 'assistant/message');
38
+ const pending = pendingActions(events);
39
+ if (!pending.length && (tail.some(e => (chatReplyFromEvent(e) && !chatReplyFromEvent(e).intermediate) || deliveredAttachment(e)) || last?.type === 'assistant/message' && !last.data.interrupted && !last.data.message.content.some(b => b.type === 'tool-call') && last.data.message.content.some(b => b.type === 'text' && b.text.trim())))
40
+ return { ...state, phase: 'complete' };
41
+ // Reasoning blocks are not user-visible answers. Interrupted/tool/media content is not an empty text stop.
42
+ if (!inspectOnly && (last?.type !== 'assistant/message' || last.data.interrupted || last.data.message.content.some(b => b.type !== 'text' && b.type !== 'reasoning')))
43
+ return;
44
+ const calls = new Map();
45
+ for (const e of tail)
46
+ if (e.type === 'tool/call') {
47
+ const c = call(e.data.name, e.data.arguments);
48
+ calls.set(e.data.callId, c);
49
+ if (!replyControl.has(c.name) && !discovery(c.name, c.args))
50
+ state.phase = 'settle';
51
+ }
52
+ for (const e of tail) {
53
+ const result = e.type === 'tool/result' ? e.data.message : e.type === 'tool/ptc-dispatch' ? e.data : undefined;
54
+ const c = e.type === 'tool/result' ? calls.get(e.data.message.toolCallId) : e.type === 'tool/ptc-dispatch' ? call(e.data.name, e.data.arguments) : undefined;
55
+ if (!result || result.isError || !c)
56
+ continue;
57
+ for (const block of result.content ?? [])
58
+ if (block.type === 'text') {
59
+ const value = object(block.text);
60
+ if (c.name === 'generate_image' && Array.isArray(value?.files))
61
+ for (const f of value.files)
62
+ if (typeof f?.path === 'string')
63
+ state.files.push(f.path);
64
+ if (c.name === 'partner_send_attachment' && typeof value?.deliveryId === 'string')
65
+ state.deliveries.push(value.deliveryId);
66
+ }
67
+ }
68
+ return state;
69
+ }
70
+ export const INCOMPLETE_REPLY = '本次请求未完成:模型连续未完成答复或已告知的动作。已执行的操作不会自动重做,请查看本次执行记录后再决定是否重试。';
71
+ /** Same-turn recovery with a bounded request budget and a settlement-only tool gate. */
72
+ export class ReplyCompletionGuard {
73
+ agent;
74
+ active;
75
+ userId = '';
76
+ attempts = 0;
77
+ settling;
78
+ failed = false;
79
+ constructor(agent, active) {
80
+ this.agent = agent;
81
+ this.active = active;
82
+ }
83
+ stop = ({ agent, signal }) => {
84
+ if (agent !== this.agent || signal.aborted || !this.active())
85
+ return;
86
+ const state = replyCompletionState(agent.session.snapshotEvents());
87
+ if (!state || state.phase === 'complete')
88
+ return;
89
+ if (state.userId !== this.userId) {
90
+ this.userId = state.userId;
91
+ this.attempts = 0;
92
+ this.settling = undefined;
93
+ }
94
+ if (this.attempts >= 2) {
95
+ this.failed = true;
96
+ throw Error(INCOMPLETE_REPLY);
97
+ }
98
+ this.attempts++;
99
+ const pending = pendingActions(agent.session.snapshotEvents());
100
+ this.settling = state.phase === 'settle' ? state : undefined;
101
+ const action = pending.length ? '仅继续尚未调用的承诺动作,已调用的操作不得重做;若已有失败或无法继续,按事实结束。' : state.phase === 'execute' ? '还没有实际工作提交。继续处理当前用户请求,工具目录与参数说明不等于执行;需要工作就实际调用,不能执行就按事实答复。' : '已提交过实际工作。只根据现有工具回执交付或答复,不重新执行或猜测成功。成功生成的文件可通过附件工具交付;发送失败只能按原 deliveryId 重试。其他失败或状态不明请按事实简短说明。';
102
+ agent.steer(createUserMessage({ source: { kind: 'plugin:@lemoncat7/dsh-partner', plugin: '@lemoncat7/dsh-partner', form: 'notice', summary: '当前请求答复完整性检查' }, content: [{ type: 'text', text: `${pending.length ? pendingActionNotice(pending) : ''} 当前请求尚无最终答复或已确认交付,不能以空正文结束。${action} 已送达的前置回应不要重复。以上仅是内部执行检查,不是对用户的回复稿;不要向用户复述回执、空答复、恢复或工具目录等内部流程。需要答复时沿用当前人格,只说实际结果或具体阻碍,不用空泛道歉代替尚可执行的工作。此恢复留在当前用户回合,不交给自主活动。` }] }));
103
+ };
104
+ deny(name, args) {
105
+ if (!this.settling || !this.active())
106
+ return;
107
+ const current = replyCompletionState(this.agent.session.snapshotEvents(), true);
108
+ // While a tool call is live, use the latest actual user id, not the final-answer projection.
109
+ const user = [...this.agent.session.snapshotEvents()].reverse().find(e => e.type === 'user/message' && e.data.source.kind === 'user');
110
+ if (user?.type !== 'user/message' || user.data.id !== this.userId)
111
+ return;
112
+ const c = call(name, args);
113
+ const missing = pendingActions(this.agent.session.snapshotEvents());
114
+ if (missing.includes(c.name) && c.name !== 'partner_tools')
115
+ return;
116
+ if (discovery(c.name, c.args) || c.name === 'partner_chat_reply' || c.name === 'partner_chat_say' && c.args.beforeTools !== true)
117
+ return;
118
+ if (c.name === 'partner_send_attachment' && ((typeof c.args.path === 'string' && [...this.settling.files, ...(current?.files ?? [])].includes(c.args.path)) || (typeof c.args.deliveryId === 'string' && [...this.settling.deliveries, ...(current?.deliveries ?? [])].includes(c.args.deliveryId))))
119
+ return;
120
+ return '本次只在恢复最终答复,原工作已有提交记录,不能重复或新增执行。请根据已有回执答复;已生成图片可交付原文件,附件重试使用原 deliveryId。';
121
+ }
122
+ }
123
+ //# sourceMappingURL=reply-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-completion.js","sourceRoot":"","sources":["../../src/chat/reply-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
2
+ import type { ChannelSession } from '../domain.js';
3
+ /** Only runtime-confirmed progress is visible speech; an attempted send is not a reply. */
4
+ export declare function confirmedProgress(events: readonly SessionEvent[]): Map<number, string>;
5
+ export declare function replyContinuity(sessionId: string, events: readonly SessionEvent[], sessions: readonly ChannelSession[]): {
6
+ confirmedMessages: {
7
+ seq: number;
8
+ text: string;
9
+ }[];
10
+ dialogue: {
11
+ role: string;
12
+ text: string;
13
+ }[];
14
+ historicalSleep: {
15
+ seq: number;
16
+ text: string;
17
+ }[];
18
+ };
19
+ export declare function renderReplyContinuity(sessionId: string, events: readonly SessionEvent[], sessions: readonly ChannelSession[]): string;
20
+ //# sourceMappingURL=reply-continuity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-continuity.d.ts","sourceRoot":"","sources":["../../src/chat/reply-continuity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAIlD,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBtF;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE;;aAM/E,MAAM;cAAQ,MAAM;;;cAC5B,MAAM;cAAQ,MAAM;;;aAFd,MAAM;cAAQ,MAAM;;EAoCzD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAIrI"}
@@ -0,0 +1,97 @@
1
+ import { questionOrigin } from '../channels/question-origin.js';
2
+ import { chatReplyFromEvent } from './protocol.js';
3
+ /** Only runtime-confirmed progress is visible speech; an attempted send is not a reply. */
4
+ export function confirmedProgress(events) {
5
+ const calls = new Map(), result = new Map(), seen = new Set();
6
+ for (const event of events) {
7
+ if (event.type === 'tool/call' && event.data.name === 'partner_chat_progress')
8
+ calls.set(event.data.callId, event.data.arguments);
9
+ let id, args, content;
10
+ if (event.type === 'tool/result' && !event.data.message.isError && calls.has(event.data.message.toolCallId)) {
11
+ id = event.data.message.toolCallId;
12
+ args = calls.get(id);
13
+ content = event.data.message.content;
14
+ }
15
+ else if (event.type === 'tool/ptc-dispatch' && event.data.name === 'partner_chat_progress' && !event.data.isError) {
16
+ id = event.data.subCallId;
17
+ args = event.data.arguments;
18
+ content = event.data.content;
19
+ }
20
+ if (!id || seen.has(id) || !Array.isArray(content))
21
+ continue;
22
+ const confirmed = content.some(b => b?.type === 'text' && (b.text === '前置回应已送达;继续执行任务,完成后再给出最终回复。' || b.text === '{"delivered":true}'));
23
+ if (!confirmed)
24
+ continue;
25
+ try {
26
+ const value = typeof args === 'string' ? JSON.parse(args) : args;
27
+ if (value && typeof value === 'object' && typeof value.text === 'string') {
28
+ result.set(event.seq, value.text);
29
+ seen.add(id);
30
+ }
31
+ }
32
+ catch { /* Malformed historical arguments are not visible speech. */ }
33
+ }
34
+ return result;
35
+ }
36
+ const textOf = (content) => content.filter(b => b.type === 'text').map(b => b.text ?? '').join('\n');
37
+ export function replyContinuity(sessionId, events, sessions) {
38
+ const route = questionOrigin(sessionId, events, sessions);
39
+ const recentUsers = events.filter(e => e.type === 'user/message' && e.data.source.kind === 'user' && (route ? route.inboundMessageIds?.includes(e.data.id) : !sessions.some(r => r.kind === 'channel' && r.inboundMessageIds?.includes(e.data.id))));
40
+ const since = recentUsers.slice(-6)[0]?.seq ?? 0;
41
+ const progress = confirmedProgress(events);
42
+ const historicalSleep = [];
43
+ const confirmedMessages = [];
44
+ const dialogue = [];
45
+ const prefix = [];
46
+ const callOrigins = new Map();
47
+ let eventRoute;
48
+ for (const event of events) {
49
+ prefix.push(event);
50
+ if (event.type === 'user/message' && event.data.source.kind === 'user')
51
+ eventRoute = questionOrigin(sessionId, prefix, sessions);
52
+ if (event.type === 'tool/call')
53
+ callOrigins.set(event.data.callId, eventRoute?.id);
54
+ if (event.type === 'tool/ptc-dispatch-start')
55
+ callOrigins.set(event.data.subCallId, callOrigins.has(event.data.rootCallId) ? callOrigins.get(event.data.rootCallId) : eventRoute?.id);
56
+ if (event.seq < since)
57
+ continue;
58
+ const sameRoute = eventRoute?.id === route?.id;
59
+ const progressCallId = event.type === 'tool/result' ? event.data.message.toolCallId : event.type === 'tool/ptc-dispatch' ? (callOrigins.has(event.data.subCallId) ? event.data.subCallId : event.data.rootCallId) : undefined;
60
+ const progressForRoute = progressCallId && callOrigins.has(progressCallId) && callOrigins.get(progressCallId) === route?.id;
61
+ if (progressForRoute && progress.has(event.seq)) {
62
+ dialogue.push({ role: 'assistant', text: progress.get(event.seq) });
63
+ confirmedMessages.push({ seq: event.seq, text: progress.get(event.seq) });
64
+ }
65
+ if (sameRoute && event.type === 'user/message' && event.data.source.kind === 'runtime-context') {
66
+ const snapshot = event.data.source;
67
+ if (snapshot.form === 'snapshot')
68
+ for (const section of snapshot.sections ?? []) {
69
+ if (section.name !== 'partner-conversation-memory' || typeof section.text !== 'string')
70
+ continue;
71
+ const lines = section.text.split('\n').filter(line => line.startsWith('【当前休息状态】') || line.startsWith('本轮是睡眠中的私聊呼唤')).map(line => line.split('。')[0] + (line.includes('。') ? '。' : ''));
72
+ if (lines.length)
73
+ historicalSleep.push({ seq: event.seq, text: lines.join('\n') });
74
+ }
75
+ }
76
+ if (event.type === 'user/message' && event.data.source.kind === 'user' &&
77
+ (route ? route.inboundMessageIds?.includes(event.data.id) : !sessions.some(r => r.kind === 'channel' && r.inboundMessageIds?.includes(event.data.id)))) {
78
+ dialogue.push({ role: 'user', text: textOf(event.data.content) });
79
+ }
80
+ const reply = chatReplyFromEvent(event);
81
+ if (reply && (reply.originRouteId ?? undefined) === route?.id) {
82
+ const text = [reply.parts.filter(p => p.type === 'text').map(p => p.text).join('\n'), reply.spokenText].filter(Boolean).join('\n');
83
+ if (text)
84
+ dialogue.push({ role: 'assistant', text });
85
+ if (reply.delivered && reply.spokenText)
86
+ confirmedMessages.push({ seq: event.seq, text: reply.spokenText });
87
+ }
88
+ }
89
+ return { confirmedMessages: confirmedMessages.slice(-4), dialogue: dialogue.slice(-12), historicalSleep: historicalSleep.filter((r, i, all) => i === 0 || all[i - 1].text !== r.text).slice(-4) };
90
+ }
91
+ export function renderReplyContinuity(sessionId, events, sessions) {
92
+ const context = replyContinuity(sessionId, events, sessions);
93
+ if (!context.historicalSleep.length && !context.confirmedMessages.length)
94
+ return '';
95
+ return '【近期交流依据 · 程序记录】\n' + JSON.stringify({ historicalSleep: context.historicalSleep, confirmedMessages: context.confirmedMessages }) + '\nhistoricalSleep 是当时的状态,不代替当前状态;confirmedMessages 是已确认送达的接话、前置消息或语音。没有依据时不补写原因。';
96
+ }
97
+ //# sourceMappingURL=reply-continuity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-continuity.js","sourceRoot":"","sources":["../../src/chat/reply-continuity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
2
+ export declare const SHORT_EXPRESSION_CHARS = 20;
3
+ export declare const SHORT_EXPRESSION_TOTAL = 48;
4
+ /** One advisory rewrite per phase/input; never truncate, edit facts or loop on style. */
5
+ export declare function checkShortExpression(agent: object, events: readonly SessionEvent[], texts: readonly string[], phase: 'speech' | 'final', enabled: boolean, expanded?: boolean): void;
6
+ //# sourceMappingURL=short-expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"short-expression.d.ts","sourceRoot":"","sources":["../../src/chat/short-expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAExC,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,YAAY,EAAE,EAAC,KAAK,EAAC,SAAS,MAAM,EAAE,EAAC,KAAK,EAAC,QAAQ,GAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,UAAM,GAAE,IAAI,CAYnK"}