@lemoncat7/dsh-partner 2.23.40 → 2.24.0-rc.9

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 (332) hide show
  1. package/README.md +5 -0
  2. package/docs/channel-activities.md +56 -0
  3. package/docs/compatibility-0.2.2-rc.1.md +7 -0
  4. package/docs/releases/2.23.41.md +9 -0
  5. package/docs/releases/2.23.42.md +11 -0
  6. package/docs/releases/2.23.43.md +13 -0
  7. package/docs/releases/2.23.44.md +13 -0
  8. package/docs/releases/2.23.45.md +11 -0
  9. package/docs/releases/2.23.46.md +5 -0
  10. package/docs/releases/2.23.47.md +5 -0
  11. package/docs/releases/2.23.48.md +6 -0
  12. package/docs/releases/2.23.49.md +6 -0
  13. package/docs/releases/2.23.50.md +6 -0
  14. package/docs/releases/2.23.51.md +5 -0
  15. package/docs/releases/2.23.52.md +7 -0
  16. package/docs/releases/2.23.53.md +5 -0
  17. package/docs/releases/2.23.54.md +7 -0
  18. package/docs/releases/2.24.0-rc.2.md +9 -0
  19. package/docs/releases/2.24.0-rc.3.md +6 -0
  20. package/docs/releases/2.24.0-rc.4.md +11 -0
  21. package/docs/releases/2.24.0-rc.5.md +11 -0
  22. package/docs/releases/2.24.0-rc.6.md +12 -0
  23. package/docs/releases/2.24.0-rc.9.md +5 -0
  24. package/lib/agent-runtime.d.ts +5 -2
  25. package/lib/agent-runtime.d.ts.map +1 -1
  26. package/lib/agent-runtime.js +204 -85
  27. package/lib/agent-runtime.js.map +1 -1
  28. package/lib/api.d.ts +1 -0
  29. package/lib/api.d.ts.map +1 -1
  30. package/lib/api.js +69 -2
  31. package/lib/api.js.map +1 -1
  32. package/lib/attachments/reply-document.d.ts +5 -0
  33. package/lib/attachments/reply-document.d.ts.map +1 -1
  34. package/lib/attachments/reply-document.js +7 -3
  35. package/lib/attachments/reply-document.js.map +1 -1
  36. package/lib/attachments/tool.d.ts +1 -1
  37. package/lib/attachments/tool.d.ts.map +1 -1
  38. package/lib/attachments/tool.js +2 -2
  39. package/lib/attachments/tool.js.map +1 -1
  40. package/lib/channels/activity-defaults.d.ts +4 -0
  41. package/lib/channels/activity-defaults.d.ts.map +1 -0
  42. package/lib/channels/activity-defaults.js +15 -0
  43. package/lib/channels/activity-defaults.js.map +1 -0
  44. package/lib/channels/activity-registry.d.ts +37 -0
  45. package/lib/channels/activity-registry.d.ts.map +1 -0
  46. package/lib/channels/activity-registry.js +53 -0
  47. package/lib/channels/activity-registry.js.map +1 -0
  48. package/lib/channels/bilibili/activity-provider.d.ts +3 -0
  49. package/lib/channels/bilibili/activity-provider.d.ts.map +1 -0
  50. package/lib/channels/bilibili/activity-provider.js +8 -0
  51. package/lib/channels/bilibili/activity-provider.js.map +1 -0
  52. package/lib/channels/bilibili/catalog.d.ts +23 -0
  53. package/lib/channels/bilibili/catalog.d.ts.map +1 -0
  54. package/lib/channels/bilibili/catalog.js +45 -0
  55. package/lib/channels/bilibili/catalog.js.map +1 -0
  56. package/lib/channels/bilibili/media.d.ts +9 -0
  57. package/lib/channels/bilibili/media.d.ts.map +1 -0
  58. package/lib/channels/bilibili/media.js +67 -0
  59. package/lib/channels/bilibili/media.js.map +1 -0
  60. package/lib/channels/bilibili/service.d.ts +37 -0
  61. package/lib/channels/bilibili/service.d.ts.map +1 -0
  62. package/lib/channels/bilibili/service.js +138 -0
  63. package/lib/channels/bilibili/service.js.map +1 -0
  64. package/lib/channels/bilibili/tools.d.ts +6 -0
  65. package/lib/channels/bilibili/tools.d.ts.map +1 -0
  66. package/lib/channels/bilibili/tools.js +48 -0
  67. package/lib/channels/bilibili/tools.js.map +1 -0
  68. package/lib/channels/direct/message-format.js +298 -206
  69. package/lib/channels/direct/message-format.js.map +4 -4
  70. package/lib/channels/manager.d.ts +1 -0
  71. package/lib/channels/manager.d.ts.map +1 -1
  72. package/lib/channels/manager.js +48 -5
  73. package/lib/channels/manager.js.map +1 -1
  74. package/lib/channels/qq/action-catalog.js +2 -2
  75. package/lib/channels/qq/action-catalog.js.map +1 -1
  76. package/lib/channels/qq/actions.d.ts +2 -1
  77. package/lib/channels/qq/actions.d.ts.map +1 -1
  78. package/lib/channels/qq/actions.js +14 -2
  79. package/lib/channels/qq/actions.js.map +1 -1
  80. package/lib/channels/qq/activity-provider.d.ts +4 -0
  81. package/lib/channels/qq/activity-provider.d.ts.map +1 -0
  82. package/lib/channels/qq/activity-provider.js +21 -0
  83. package/lib/channels/qq/activity-provider.js.map +1 -0
  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 +3 -3
  87. package/lib/channels/qq/authority.js.map +1 -1
  88. package/lib/channels/qq/connection.d.ts +5 -0
  89. package/lib/channels/qq/connection.d.ts.map +1 -1
  90. package/lib/channels/qq/connection.js +12 -2
  91. package/lib/channels/qq/connection.js.map +1 -1
  92. package/lib/channels/qq/message.d.ts.map +1 -1
  93. package/lib/channels/qq/message.js +11 -1
  94. package/lib/channels/qq/message.js.map +1 -1
  95. package/lib/channels/qq/reply-tool.d.ts.map +1 -1
  96. package/lib/channels/qq/reply-tool.js +62 -6
  97. package/lib/channels/qq/reply-tool.js.map +1 -1
  98. package/lib/channels/weixin/connect.d.ts +3 -1
  99. package/lib/channels/weixin/connect.d.ts.map +1 -1
  100. package/lib/character/activity-journal.d.ts +20 -0
  101. package/lib/character/activity-journal.d.ts.map +1 -0
  102. package/lib/character/activity-journal.js +78 -0
  103. package/lib/character/activity-journal.js.map +1 -0
  104. package/lib/character/activity-plan.d.ts +27 -0
  105. package/lib/character/activity-plan.d.ts.map +1 -0
  106. package/lib/character/activity-plan.js +47 -0
  107. package/lib/character/activity-plan.js.map +1 -0
  108. package/lib/character/activity-tool.d.ts.map +1 -1
  109. package/lib/character/activity-tool.js +24 -4
  110. package/lib/character/activity-tool.js.map +1 -1
  111. package/lib/character/affection-tool.js +4 -4
  112. package/lib/character/affection-tool.js.map +1 -1
  113. package/lib/character/affection.d.ts +8 -43
  114. package/lib/character/affection.d.ts.map +1 -1
  115. package/lib/character/affection.js +7 -24
  116. package/lib/character/affection.js.map +1 -1
  117. package/lib/character/background-context.d.ts +6 -0
  118. package/lib/character/background-context.d.ts.map +1 -0
  119. package/lib/character/background-context.js +29 -0
  120. package/lib/character/background-context.js.map +1 -0
  121. package/lib/character/conversation-behavior.d.ts +2 -0
  122. package/lib/character/conversation-behavior.d.ts.map +1 -1
  123. package/lib/character/conversation-behavior.js +16 -12
  124. package/lib/character/conversation-behavior.js.map +1 -1
  125. package/lib/character/domain.d.ts +10 -0
  126. package/lib/character/domain.d.ts.map +1 -1
  127. package/lib/character/domain.js +7 -0
  128. package/lib/character/domain.js.map +1 -1
  129. package/lib/character/habit-tool.d.ts +4 -0
  130. package/lib/character/habit-tool.d.ts.map +1 -0
  131. package/lib/character/habit-tool.js +31 -0
  132. package/lib/character/habit-tool.js.map +1 -0
  133. package/lib/character/habits.d.ts +38 -0
  134. package/lib/character/habits.d.ts.map +1 -0
  135. package/lib/character/habits.js +92 -0
  136. package/lib/character/habits.js.map +1 -0
  137. package/lib/character/idle-contact.d.ts +11 -4
  138. package/lib/character/idle-contact.d.ts.map +1 -1
  139. package/lib/character/idle-contact.js +28 -49
  140. package/lib/character/idle-contact.js.map +1 -1
  141. package/lib/character/interaction-review.d.ts +44 -0
  142. package/lib/character/interaction-review.d.ts.map +1 -0
  143. package/lib/character/interaction-review.js +141 -0
  144. package/lib/character/interaction-review.js.map +1 -0
  145. package/lib/character/post-reply.d.ts +1 -3
  146. package/lib/character/post-reply.d.ts.map +1 -1
  147. package/lib/character/post-reply.js +15 -18
  148. package/lib/character/post-reply.js.map +1 -1
  149. package/lib/character/prompt-projection.d.ts +1 -0
  150. package/lib/character/prompt-projection.d.ts.map +1 -1
  151. package/lib/character/prompt-projection.js +8 -1
  152. package/lib/character/prompt-projection.js.map +1 -1
  153. package/lib/character/thought-tool.d.ts +4 -0
  154. package/lib/character/thought-tool.d.ts.map +1 -0
  155. package/lib/character/thought-tool.js +99 -0
  156. package/lib/character/thought-tool.js.map +1 -0
  157. package/lib/character/thoughts.d.ts +42 -0
  158. package/lib/character/thoughts.d.ts.map +1 -0
  159. package/lib/character/thoughts.js +91 -0
  160. package/lib/character/thoughts.js.map +1 -0
  161. package/lib/chat/context-selection.d.ts.map +1 -1
  162. package/lib/chat/context-selection.js +5 -2
  163. package/lib/chat/context-selection.js.map +1 -1
  164. package/lib/chat/intermediate-delivery.d.ts +7 -0
  165. package/lib/chat/intermediate-delivery.d.ts.map +1 -0
  166. package/lib/chat/intermediate-delivery.js +14 -0
  167. package/lib/chat/intermediate-delivery.js.map +1 -0
  168. package/lib/chat/live-speech.d.ts +5 -2
  169. package/lib/chat/live-speech.d.ts.map +1 -1
  170. package/lib/chat/live-speech.js +39 -12
  171. package/lib/chat/live-speech.js.map +1 -1
  172. package/lib/chat/persona-delivery.d.ts +29 -0
  173. package/lib/chat/persona-delivery.d.ts.map +1 -0
  174. package/lib/chat/persona-delivery.js +129 -0
  175. package/lib/chat/persona-delivery.js.map +1 -0
  176. package/lib/chat/reply-continuity.d.ts.map +1 -1
  177. package/lib/chat/reply-continuity.js +12 -0
  178. package/lib/chat/reply-continuity.js.map +1 -1
  179. package/lib/chat/tools.d.ts.map +1 -1
  180. package/lib/chat/tools.js +41 -19
  181. package/lib/chat/tools.js.map +1 -1
  182. package/lib/chat/work-expression.d.ts +36 -0
  183. package/lib/chat/work-expression.d.ts.map +1 -1
  184. package/lib/chat/work-expression.js +80 -15
  185. package/lib/chat/work-expression.js.map +1 -1
  186. package/lib/client-api.d.ts +14 -1
  187. package/lib/client-api.d.ts.map +1 -1
  188. package/lib/client-api.js.map +1 -1
  189. package/lib/client.d.ts.map +1 -1
  190. package/lib/client.js +9670 -13202
  191. package/lib/client.js.map +4 -4
  192. package/lib/collaboration/composition.d.ts.map +1 -1
  193. package/lib/collaboration/composition.js +6 -2
  194. package/lib/collaboration/composition.js.map +1 -1
  195. package/lib/collaboration/tool-discovery.d.ts.map +1 -1
  196. package/lib/collaboration/tool-discovery.js +12 -6
  197. package/lib/collaboration/tool-discovery.js.map +1 -1
  198. package/lib/companions/identity-tool.d.ts +1 -1
  199. package/lib/companions/identity-tool.d.ts.map +1 -1
  200. package/lib/companions/identity-tool.js +3 -4
  201. package/lib/companions/identity-tool.js.map +1 -1
  202. package/lib/companions/identity.js +4 -4
  203. package/lib/companions/identity.js.map +1 -1
  204. package/lib/companions/persona-refinement.d.ts.map +1 -1
  205. package/lib/companions/persona-refinement.js +1 -45
  206. package/lib/companions/persona-refinement.js.map +1 -1
  207. package/lib/compat/native-presentation.d.ts +4 -0
  208. package/lib/compat/native-presentation.d.ts.map +1 -0
  209. package/lib/compat/native-presentation.js +40 -0
  210. package/lib/compat/native-presentation.js.map +1 -0
  211. package/lib/compat/ptc-events.d.ts +2 -0
  212. package/lib/compat/ptc-events.d.ts.map +1 -0
  213. package/lib/compat/ptc-events.js +2 -0
  214. package/lib/compat/ptc-events.js.map +1 -0
  215. package/lib/compat/tool-dispatch.d.ts +4 -0
  216. package/lib/compat/tool-dispatch.d.ts.map +1 -0
  217. package/lib/compat/tool-dispatch.js +14 -0
  218. package/lib/compat/tool-dispatch.js.map +1 -0
  219. package/lib/concern-tool.d.ts.map +1 -1
  220. package/lib/concern-tool.js +5 -3
  221. package/lib/concern-tool.js.map +1 -1
  222. package/lib/domain.d.ts +14 -1
  223. package/lib/domain.d.ts.map +1 -1
  224. package/lib/domain.js.map +1 -1
  225. package/lib/execution/agent-support.d.ts.map +1 -1
  226. package/lib/execution/agent-support.js +3 -1
  227. package/lib/execution/agent-support.js.map +1 -1
  228. package/lib/execution/operation-tool-access.d.ts.map +1 -1
  229. package/lib/execution/operation-tool-access.js +2 -6
  230. package/lib/execution/operation-tool-access.js.map +1 -1
  231. package/lib/execution/reply-progress.d.ts +1 -0
  232. package/lib/execution/reply-progress.d.ts.map +1 -1
  233. package/lib/execution/service.d.ts +2 -0
  234. package/lib/execution/service.d.ts.map +1 -1
  235. package/lib/execution/service.js +7 -1
  236. package/lib/execution/service.js.map +1 -1
  237. package/lib/execution/task-preamble.js +3 -3
  238. package/lib/execution/task-preamble.js.map +1 -1
  239. package/lib/execution/work-progress-card.d.ts +10 -0
  240. package/lib/execution/work-progress-card.d.ts.map +1 -0
  241. package/lib/execution/work-progress-card.js +45 -0
  242. package/lib/execution/work-progress-card.js.map +1 -0
  243. package/lib/execution/work-progress-state.d.ts +32 -0
  244. package/lib/execution/work-progress-state.d.ts.map +1 -0
  245. package/lib/execution/work-progress-state.js +19 -0
  246. package/lib/execution/work-progress-state.js.map +1 -0
  247. package/lib/execution/work-progress.d.ts +16 -0
  248. package/lib/execution/work-progress.d.ts.map +1 -0
  249. package/lib/execution/work-progress.js +76 -0
  250. package/lib/execution/work-progress.js.map +1 -0
  251. package/lib/execution/work-tool.d.ts.map +1 -1
  252. package/lib/execution/work-tool.js +64 -52
  253. package/lib/execution/work-tool.js.map +1 -1
  254. package/lib/index.d.ts.map +1 -1
  255. package/lib/index.js +12 -4
  256. package/lib/index.js.map +1 -1
  257. package/lib/memory-domain.d.ts +5 -0
  258. package/lib/memory-domain.d.ts.map +1 -1
  259. package/lib/memory-reflection.d.ts +5 -1
  260. package/lib/memory-reflection.d.ts.map +1 -1
  261. package/lib/memory-reflection.js +21 -3
  262. package/lib/memory-reflection.js.map +1 -1
  263. package/lib/memory-store.d.ts +1 -1
  264. package/lib/observation-loop.d.ts.map +1 -1
  265. package/lib/observation-loop.js +17 -3
  266. package/lib/observation-loop.js.map +1 -1
  267. package/lib/persona/context.d.ts +4 -0
  268. package/lib/persona/context.d.ts.map +1 -0
  269. package/lib/persona/context.js +12 -0
  270. package/lib/persona/context.js.map +1 -0
  271. package/lib/persona/domain.d.ts +2 -1
  272. package/lib/persona/domain.d.ts.map +1 -1
  273. package/lib/persona/domain.js +11 -3
  274. package/lib/persona/domain.js.map +1 -1
  275. package/lib/persona/service.js +2 -2
  276. package/lib/persona/service.js.map +1 -1
  277. package/lib/persona/store.js +7 -7
  278. package/lib/persona/store.js.map +1 -1
  279. package/lib/persona/types.d.ts +3 -1
  280. package/lib/persona/types.d.ts.map +1 -1
  281. package/lib/store.d.ts.map +1 -1
  282. package/lib/store.js +23 -0
  283. package/lib/store.js.map +1 -1
  284. package/lib/ui/affection-panel.d.ts.map +1 -1
  285. package/lib/ui/affection-panel.js +2 -2
  286. package/lib/ui/affection-panel.js.map +1 -1
  287. package/lib/ui/bilibili-settings.d.ts +12 -0
  288. package/lib/ui/bilibili-settings.d.ts.map +1 -0
  289. package/lib/ui/bilibili-settings.js +77 -0
  290. package/lib/ui/bilibili-settings.js.map +1 -0
  291. package/lib/ui/channels-panel.d.ts.map +1 -1
  292. package/lib/ui/channels-panel.js +4 -3
  293. package/lib/ui/channels-panel.js.map +1 -1
  294. package/lib/ui/character-editor.d.ts.map +1 -1
  295. package/lib/ui/character-editor.js +4 -2
  296. package/lib/ui/character-editor.js.map +1 -1
  297. package/lib/ui/companion-vitals.js +1 -1
  298. package/lib/ui/companion-vitals.js.map +1 -1
  299. package/lib/ui/exclusive-prompt-toggle.d.ts +5 -0
  300. package/lib/ui/exclusive-prompt-toggle.d.ts.map +1 -0
  301. package/lib/ui/exclusive-prompt-toggle.js +7 -0
  302. package/lib/ui/exclusive-prompt-toggle.js.map +1 -0
  303. package/lib/ui/habits-panel.d.ts +4 -0
  304. package/lib/ui/habits-panel.d.ts.map +1 -0
  305. package/lib/ui/habits-panel.js +30 -0
  306. package/lib/ui/habits-panel.js.map +1 -0
  307. package/lib/ui/identity-editor.js +1 -8
  308. package/lib/ui/identity-editor.js.map +1 -1
  309. package/lib/ui/idle-contact-editor.d.ts.map +1 -1
  310. package/lib/ui/idle-contact-editor.js +4 -1
  311. package/lib/ui/idle-contact-editor.js.map +1 -1
  312. package/lib/ui/memory/persona-view.js +1 -1
  313. package/lib/ui/memory/persona-view.js.map +1 -1
  314. package/lib/ui/push-draft.d.ts +3 -3
  315. package/lib/ui/qq-capability-settings.js +1 -1
  316. package/lib/ui/qq-capability-settings.js.map +1 -1
  317. package/lib/ui/thoughts-panel.d.ts +4 -0
  318. package/lib/ui/thoughts-panel.d.ts.map +1 -0
  319. package/lib/ui/thoughts-panel.js +51 -0
  320. package/lib/ui/thoughts-panel.js.map +1 -0
  321. package/lib/ui/workspace-navigation.d.ts +16 -16
  322. package/package.json +82 -49
  323. package/resources/bilibili/Dockerfile +7 -0
  324. package/resources/bilibili/media.py +245 -0
  325. package/resources/bilibili/requirements.txt +3 -0
  326. package/resources/bilibili/server.py +300 -0
  327. package/resources/bilibili/test_bridge.py +115 -0
  328. package/resources/bilibili/test_media.py +110 -0
  329. package/lib/chat/short-expression.d.ts +0 -6
  330. package/lib/chat/short-expression.d.ts.map +0 -1
  331. package/lib/chat/short-expression.js +0 -24
  332. package/lib/chat/short-expression.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { checkShortExpression } from './short-expression.js';
1
+ import { CONVERSATION_EXPRESSION_SCHEMA } from './work-expression.js';
2
2
  import { hasTaskPreamble } from '../execution/task-preamble.js';
3
3
  import { isIdleContactNotice } from '../character/idle-contact.js';
4
4
  import { isInternalTaskNotice, isRequirementDeliveryReceipt } from '../channels/delivery-policy.js';
@@ -21,6 +21,8 @@ export function hasCurrentSpeech(events) {
21
21
  for (const e of [...events].reverse()) {
22
22
  if (e.type === 'turn/start' || e.type === 'user/message' && (e.data.source.kind === 'user' || isIdleContactNotice(e) || isInternalTaskNotice(e) && !isRequirementDeliveryReceipt(e)))
23
23
  return false;
24
+ if (e.type === 'tool/call' && e.data.name === 'partner_work_execute')
25
+ return false;
24
26
  const reply = chatReplyFromEvent(e);
25
27
  if (reply?.intermediate && reply.delivered && reply.inputMessageId === currentInput(events))
26
28
  return !reply.taskPreamble;
@@ -46,7 +48,7 @@ export class LiveSpeech {
46
48
  this.send = send;
47
49
  this.active = active;
48
50
  }
49
- say(raw, signal, expanded = false, task = false) {
51
+ say(raw, signal, expanded = false, task = false, validate) {
50
52
  const input = currentInput(this.events());
51
53
  if (!input || !this.active())
52
54
  return Promise.reject(Error('只能在当前用户聊天中接话;不能用于闲时活动或内部任务'));
@@ -67,6 +69,7 @@ export class LiveSpeech {
67
69
  signal.throwIfAborted();
68
70
  if (this.failed || !this.active() || currentInput(this.events()) !== input)
69
71
  throw Error('输入或发送状态已变化,旧接话未发送;先处理新消息,不重试未知发送');
72
+ validate?.();
70
73
  await this.send(text);
71
74
  });
72
75
  this.sent.set(key, job);
@@ -74,21 +77,45 @@ export class LiveSpeech {
74
77
  return job;
75
78
  }
76
79
  }
77
- export function installLiveSpeech(agent, send, route, chatEnabled = () => true, short = () => true) {
80
+ export function installLiveSpeech(agent, send, route, chatEnabled = () => true, short = () => true, compose, voice) {
78
81
  const speech = new LiveSpeech(() => agent.session.snapshotEvents(), send, () => !!route());
79
82
  const taskSends = new Map();
80
83
  return agent.ctx.tools.register({
81
84
  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
+ description: '当前私聊统一说话入口:任务前及工作中优先提交 expression(只写意图,结果引用真实 sourceCalls),由只读表达器结合当前人物和近期双方聊天生成一句,再确认送达后继续本轮。expression 不执行任何工作。普通闲聊也可直接 text,由投递前的人格表达步骤生成实际正文;用户要求原文用 text 与 preserveText:true。两者不能同时提供;表达生成失败未发送时直接 text 接话,不重复交接。每一句都直接按当前角色、关系和聊天节奏写,不展示思考过程,不切换成客服、主持人或任务播报。普通接话省略 beforeTools;实际执行工具或长任务前,用同一入口、beforeTools:true,按人格简短说准备做什么,并用 expectedTools 列出本轮承诺实际调用的具体工具名(必须是当前已注册的真实名称,未知时先查目录,不能猜别名或填目录入口 partner_tools);生图并发送应列实际选择的生图入口(image_gen.imagegen 或 generate_image)及 partner_send_attachment。角色扮演中的叙事动作不需要伪造工具任务;只登记真实外部操作,不为叙事动作额外委派工作。成功后再工作;这句话就是前置回应,不再另外重复。同轮后续新增真实动作时,再用 beforeTools:true 与 expectedTools 登记;程序保留新增动作而不重复发前置回应,普通补话仍可单独发送。尚未执行用将要做的语气,不虚构完成或无权限。自然想补一句、改口或工作后有新话时可再次调用,不强制连发,不把长解释分批倾倒。收到新消息先接新消息。说完用 partner_chat_reply 结束,最终文字也保持同一人物声音;当前输入后已有普通接话送达且没有新话可 messages:[],仅有任务前告知不能代替完成答复。',
86
+ parameters: { type: 'object', properties: { preserveText: { type: 'boolean', description: '仅当前用户指定的原文,且 text 可在用户原话中核对时使用。' }, expression: CONVERSATION_EXPRESSION_SCHEMA, 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: '仅用户明确要求详细内容、原文或完整任务计划时使用;普通接话不借此展开长文。' } }, anyOf: [{ required: ['text'] }, { required: ['expression'] }], additionalProperties: false },
87
+ output: { schema: { type: 'object' }, render: (_args, value) => [{ type: 'text', text: value.actionsAdded ? '新增动作已登记,没有重复发送前置回应;继续执行新增动作,已经完成的操作不要重做。' : value.alreadyAnnounced ? '动作已告知,本次没有重复发送;继续执行任务。' : '这句话已发送。继续按同一人物口吻接话或执行已告知的操作;完成后用 partner_chat_reply 结束,不重复已说内容。仅任务前告知不能代替任务最终答复。' + (typeof value.spokenText === 'string' ? '\n实际发送的正文:' + value.spokenText : '') }], presentationMeta: (_args, value) => value },
85
88
  presentCall: () => ({ card: 'generic', title: '接话' }),
86
89
  async execute(raw, exec) {
87
90
  const originRouteId = route();
88
91
  if (!originRouteId)
89
92
  throw Error('当前聊天目标已失效');
90
93
  const inputMessageId = currentInput(agent.session.snapshotEvents());
91
- const { text, beforeTools, inlineDetails, expectedTools } = raw;
94
+ const { beforeTools, inlineDetails, expectedTools, expression } = raw;
95
+ let text = raw.text ?? '';
96
+ if (expression !== undefined && raw.text !== undefined)
97
+ throw Error('expression 只提交意图,不能同时提交 text 成稿');
98
+ let authored;
99
+ let voiced;
100
+ const resolveText = async () => {
101
+ if (expression === undefined) {
102
+ if (voice) {
103
+ voiced = await voice(text, exec, beforeTools === true, raw.preserveText === true, inlineDetails === true);
104
+ if (voiced.parts.length !== 1 || !('text' in voiced.parts[0]))
105
+ throw Error('本次接话未得到单条文字,未发送');
106
+ text = voiced.parts[0].text;
107
+ voiced.validate?.();
108
+ }
109
+ return;
110
+ }
111
+ if (!compose)
112
+ throw Error('当前会话未提供表达器,未发送;请直接用 text 接话');
113
+ authored = await compose(expression, exec, beforeTools === true);
114
+ if (authored.parts.length !== 1 || !('text' in authored.parts[0]))
115
+ throw Error('表达器未生成单条文字,未发送;请直接用 text 接话');
116
+ text = authored.parts[0].text;
117
+ authored.validate?.();
118
+ };
92
119
  exec.signal.throwIfAborted();
93
120
  if (!beforeTools && !chatEnabled())
94
121
  throw Error('连续接话未开启;任务动作告知使用 beforeTools:true,普通内容用最终回复');
@@ -119,18 +146,18 @@ export function installLiveSpeech(agent, send, route, chatEnabled = () => true,
119
146
  taskSends.set(inputMessageId, { names: new Set([...known, ...added]), job: Promise.resolve() });
120
147
  return { kind: 'partner-chat-v1', parts: [], delivered: true, deliveryKind: 'text', intermediate: true, taskPreamble: true, expectedTools: added, inputMessageId, originRouteId, alreadyAnnounced: true, actionsAdded: true };
121
148
  }
122
- checkShortExpression(agent, agent.session.snapshotEvents(), [text], 'speech', short(), inlineDetails === true);
149
+ await resolveText();
123
150
  // Local validation has no delivery side effect; do not cache its rejection as a send.
124
151
  validateSpeechText(text, !short() || inlineDetails === true);
125
- const job = speech.say(text, exec.signal, !short() || inlineDetails === true, true);
152
+ const job = speech.say(text, exec.signal, !short() || inlineDetails === true, true, voiced?.validate ?? authored?.validate);
126
153
  taskSends.set(inputMessageId, { names: new Set(added), job });
127
154
  await job;
128
155
  }
129
156
  else {
130
- checkShortExpression(agent, agent.session.snapshotEvents(), [text], 'speech', short(), inlineDetails === true);
131
- await speech.say(text, exec.signal, inlineDetails === true);
157
+ await resolveText();
158
+ await speech.say(text, exec.signal, inlineDetails === true, false, voiced?.validate ?? authored?.validate);
132
159
  }
133
- return { kind: 'partner-chat-v1', parts: [], delivered: true, deliveryKind: 'text', intermediate: true, ...(beforeTools ? { taskPreamble: true, expectedTools: [...expectedTools] } : {}), inputMessageId, spokenText: text.trim(), originRouteId };
160
+ return { kind: 'partner-chat-v1', parts: [], delivered: true, deliveryKind: 'text', intermediate: true, ...(beforeTools ? { taskPreamble: true, expectedTools: [...expectedTools] } : {}), inputMessageId, spokenText: text.trim(), originRouteId, ...(authored?.audit ? { workExpression: authored.audit } : {}), ...(voiced?.audit ? { personaDelivery: voiced.audit } : {}) };
134
161
  },
135
162
  });
136
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"live-speech.js","sourceRoot":"","sources":["../../src/chat/live-speech.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-speech.js","sourceRoot":"","sources":["../../src/chat/live-speech.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { ToolRunContext } from '@deepseek-ai/dsh-tools';
3
+ import type { PartnerStore } from '../store.js';
4
+ import { parseChatInput } from './protocol.js';
5
+ type Parts = ReturnType<typeof parseChatInput>;
6
+ export interface PersonaDeliveryOptions {
7
+ surface?: 'chat' | 'public-comment';
8
+ target?: string;
9
+ single?: boolean;
10
+ beforeTools?: boolean;
11
+ preserveText?: boolean;
12
+ inlineDetails?: boolean;
13
+ validate?: () => void;
14
+ }
15
+ export interface PersonaDeliveryAudit {
16
+ status: 'rendered' | 'preserved' | 'fallback';
17
+ reason?: string;
18
+ surface: 'chat' | 'public-comment';
19
+ durationMs: number;
20
+ }
21
+ export interface PersonaDeliveryResult {
22
+ parts: Parts;
23
+ audit?: PersonaDeliveryAudit;
24
+ validate?: () => void;
25
+ }
26
+ /** One read-only delivery projection. No operational tools, sends, retries or history edits. */
27
+ export declare function renderPersonaDelivery(ctx: Context, owner: string, store: PartnerStore, exec: ToolRunContext, parts: Parts, options?: PersonaDeliveryOptions): Promise<PersonaDeliveryResult>;
28
+ export {};
29
+ //# sourceMappingURL=persona-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-delivery.d.ts","sourceRoot":"","sources":["../../src/chat/persona-delivery.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAS/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,KAAK,KAAK,GAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAC5C,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,GAAC,gBAAgB,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAI,IAAI,CAAA;CACpB;AACD,MAAM,WAAW,oBAAoB;IAAG,MAAM,EAAC,UAAU,GAAC,WAAW,GAAC,UAAU,CAAC;IAAC,MAAM,CAAC,EAAC,MAAM,CAAC;IAAC,OAAO,EAAC,MAAM,GAAC,gBAAgB,CAAC;IAAC,UAAU,EAAC,MAAM,CAAA;CAAE;AACtJ,MAAM,WAAW,qBAAqB;IAAG,KAAK,EAAC,KAAK,CAAC;IAAC,KAAK,CAAC,EAAC,oBAAoB,CAAC;IAAC,QAAQ,CAAC,EAAC,MAAI,IAAI,CAAA;CAAE;AAMvG,gGAAgG;AAChG,wBAAsB,qBAAqB,CAAC,GAAG,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,YAAY,EAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,GAAC,sBAAyB,GAAE,OAAO,CAAC,qBAAqB,CAAC,CAqExL"}
@@ -0,0 +1,129 @@
1
+ import { renderHabits, habitScope } from '../character/habits.js';
2
+ import { workExpressionFailed } from './work-expression.js';
3
+ import { isIdleContactNotice } from '../character/idle-contact.js';
4
+ import { isInternalTaskNotice } from '../channels/delivery-policy.js';
5
+ import { createHash } from 'node:crypto';
6
+ import { createUserMessage } from '@deepseek-ai/dsh-llm';
7
+ import { renderExclusiveIdentity, roleTextForCard } from '../character/domain.js';
8
+ import { renderIdentityRelationship } from '../character/relationship-adapter.js';
9
+ import { currentQqIdentityRelation } from '../channels/qq/identity-binding.js';
10
+ import { isSleeping } from '../character/sleep.js';
11
+ import { channelReplyAllowed } from '../channels/reply-access.js';
12
+ import { resolveToolAccess } from '../execution/tool-access-adapter.js';
13
+ import { questionOrigin } from '../channels/question-origin.js';
14
+ import { replyContinuity } from './reply-continuity.js';
15
+ import { parseChatInput } from './protocol.js';
16
+ const cache = new WeakMap();
17
+ const textOf = (content) => content.filter(b => b.type === 'text').map(b => b.text ?? '').join('\n');
18
+ const latestSource = (events) => [...events].reverse().find(e => e.type === 'user/message' && (e.data.source.kind === 'user' || isIdleContactNotice(e) || isInternalTaskNotice(e)));
19
+ const tokens = (text) => [...new Set(text.match(/https?:\/\/[^\s<>))]+|(?:\/[\w.%@+-]+){2,}|\b\d+(?:\.\d+)?\b/g) ?? [])];
20
+ /** One read-only delivery projection. No operational tools, sends, retries or history edits. */
21
+ export async function renderPersonaDelivery(ctx, owner, store, exec, parts, options = {}) {
22
+ const surface = options.surface ?? 'chat', agent = exec.agent, companion = store.snapshot().companions.find(c => c.id === owner);
23
+ const texts = parts.flatMap(p => 'text' in p ? [p.text] : []), draft = texts.join('\n');
24
+ if (!agent || !companion?.characterCard?.enabled || !roleTextForCard({ ...companion.characterCard, examples: companion.characterCard.examples ?? [] }).trim() || !draft.trim())
25
+ return { parts };
26
+ const events = agent.session.snapshotEvents(), source = latestSource(events);
27
+ const currentUser = source?.type === 'user/message' ? textOf(source.data.content) : '';
28
+ // Keep requested literals and structured/detailed deliveries exactly as authored.
29
+ const literal = options.preserveText && texts.every(t => currentUser.includes(t));
30
+ if (literal || options.inlineDetails || /```/.test(draft) || draft.length > 2000)
31
+ return { parts, audit: { status: 'preserved', surface, durationMs: 0 } };
32
+ const route = questionOrigin(agent.session.id, events, store.snapshot().sessions);
33
+ const sleepState = JSON.stringify([companion.sleepPolicy, companion.sleepState?.episode, companion.sleepState?.reception, isSleeping(companion)]);
34
+ const identity = JSON.stringify([companion.name, companion.role, companion.description, companion.instructions, companion.characterCard, companion.relationshipText, companion.habits, companion.idleContact]);
35
+ const check = () => {
36
+ exec.signal.throwIfAborted();
37
+ options.validate?.();
38
+ const live = store.snapshot(), c = live.companions.find(c => c.id === owner), es = agent.session.snapshotEvents();
39
+ if (!c || store.isCompanionRemoving(owner) || !live.sessions.some(r => r.sessionId === agent.session.id && r.companionId === owner))
40
+ throw Error('人格表达的来源会话已失效,未发送');
41
+ if (surface === 'chat' && (!resolveToolAccess({ agent, state: live }).sendTools || route && !channelReplyAllowed(live, route.channelId, route.userId)))
42
+ throw Error('当前聊天授权已变化,未发送旧表达');
43
+ if (JSON.stringify([c.sleepPolicy, c.sleepState?.episode, c.sleepState?.reception, isSleeping(c)]) !== sleepState)
44
+ throw Error('休息状态已变化,未发送旧表达');
45
+ if (JSON.stringify([c.name, c.role, c.description, c.instructions, c.characterCard, c.relationshipText, c.habits, c.idleContact]) !== identity || latestSource(es)?.seq !== source?.seq || questionOrigin(agent.session.id, es, live.sessions)?.id !== route?.id)
46
+ throw Error('输入、人物或回复对象已变化,未发送旧表达');
47
+ };
48
+ check();
49
+ const config = [...events].reverse().find(e => e.type === 'request/header')?.data.header.config;
50
+ const fallback = (reason, durationMs = 0) => { check(); return { parts, validate: check, audit: { status: 'fallback', surface, reason, durationMs } }; };
51
+ if (workExpressionFailed(agent))
52
+ return fallback('previous-expression-failed');
53
+ if (!ctx.llm || !config)
54
+ return fallback('unavailable');
55
+ const habitOrigin = route ?? store.snapshot().sessions.find(r => r.kind === 'local' && r.sessionId === agent.session.id && r.companionId === owner);
56
+ const target = options.target ?? route?.id ?? 'local';
57
+ const key = createHash('sha256').update(JSON.stringify([source?.seq, identity, sleepState, config, target, surface, parts, options.single, options.beforeTools])).digest('hex');
58
+ let entries = cache.get(agent);
59
+ if (!entries) {
60
+ entries = new Map();
61
+ cache.set(agent, entries);
62
+ }
63
+ const prior = entries.get(key);
64
+ if (prior) {
65
+ const value = await prior;
66
+ check();
67
+ return value;
68
+ }
69
+ if (entries.size >= 32)
70
+ entries.delete(entries.keys().next().value);
71
+ const job = (async () => {
72
+ const started = Date.now(), abort = new AbortController(), signal = AbortSignal.any([exec.signal, abort.signal, AbortSignal.timeout(18000)]);
73
+ const unsubscribe = store.subscribe?.(() => { try {
74
+ check();
75
+ }
76
+ catch (e) {
77
+ abort.abort(e);
78
+ } }, () => { });
79
+ try {
80
+ const relation = currentQqIdentityRelation(agent.session.id, events, store.snapshot().sessions, store.snapshot().channels);
81
+ const dialogue = surface === 'chat' ? replyContinuity(agent.session.id, events, store.snapshot().sessions).dialogue.slice(-8) : [];
82
+ const system = renderHabits(companion, surface === 'chat' && habitOrigin ? habitScope(habitOrigin) : undefined) + '\n' + renderExclusiveIdentity({ ...companion, characterCard: companion.characterCard }) + '\n\n' +
83
+ (surface === 'chat' ? renderIdentityRelationship(companion, relation ? { channel: 'qq', matched: relation.matched } : { channel: 'default' }) : '当前在公开评论区对作者或网友说话。没有已核验的私聊亲密关系,不套用人物示例里的私聊称呼,不泄露私聊或代用户发言。') + '\n\n' +
84
+ '你负责这一次实际发出的文字。以当前人物设定的语感直接说话,不解释自己的情绪或扮演方法。输入草稿只限定要表达的意思与事实,不沿用它的句式、铺垫、汇报结构。草稿不是逐句保留的任务:先回应当前发言,公开评论只抓住核心感受或问题。草稿中的自我解释、情绪说明和修辞不是必须保留的事实。可以删掉铺垫、自我解释、讨好、自证和与本轮问题无关的旧工作,不必复述草稿所有内容。不能改变必要事实、核心意图、与当前问题相关的失败和未知项,不补经历或承诺,不虚构已经执行;链接、数字和代码原样保留。按场景只说必要的话,不追加总结或追问;本来就是询问具体内容时保留问题。只调用 render_persona_text 提交正文,不执行任何操作。';
85
+ const input = surface === 'public-comment' ? { scene: '公开评论', target, draft: texts } :
86
+ { scene: options.beforeTools ? '任务前告知,只说准备做什么,尚未执行' : '对当前对象接话', currentUser, dialogue, draft: texts };
87
+ if (JSON.stringify(input).length > 20000)
88
+ return fallback('input-limit');
89
+ const blocks = [];
90
+ let finished = false;
91
+ for await (const chunk of ctx.llm.stream({ ...config, maxTokens: Math.min(config.maxTokens ?? 1200, 1200), system,
92
+ messages: [createUserMessage({ source: { kind: 'plugin:@lemoncat7/dsh-partner', plugin: '@lemoncat7/dsh-partner', form: 'notice', summary: '本次发言资料' }, content: [{ type: 'text', text: JSON.stringify(input) }] }), ...(surface === 'chat' && currentUser.trim() ? [createUserMessage({ source: { kind: 'user' }, content: [{ type: 'text', text: currentUser }] })] : [])],
93
+ tools: [{ name: 'render_persona_text', description: '提交角色此刻对眼前这句话的回应;公开评论直接说核心感受或问题。草稿仅是资料,不逐句改写,保留必要事实与限制。', parameters: { type: 'object', additionalProperties: false, required: ['texts'], properties: { texts: { type: 'array', minItems: 1, maxItems: options.single || surface === 'public-comment' || !companion.characterCard.segmentedReplies ? 1 : Math.min(texts.length + 1, 8), items: { type: 'string', minLength: 1, maxLength: 2000 } } } } }], signal })) {
94
+ if (chunk.type === 'block-end')
95
+ blocks.push(chunk.block);
96
+ if (chunk.type === 'finish')
97
+ finished = chunk.reason.kind === 'tool-calls';
98
+ }
99
+ check();
100
+ signal.throwIfAborted();
101
+ const calls = blocks.filter(b => b.type === 'tool-call');
102
+ if (!finished || calls.length !== 1 || calls[0]?.name !== 'render_persona_text')
103
+ return fallback('invalid', Date.now() - started);
104
+ const value = typeof calls[0].arguments === 'string' ? JSON.parse(calls[0].arguments) : calls[0].arguments;
105
+ const candidate = value?.texts;
106
+ const max = options.single || surface === 'public-comment' || !companion.characterCard.segmentedReplies ? 1 : Math.min(texts.length + 1, 8);
107
+ if (!Array.isArray(candidate) || !candidate.length || candidate.length > max || candidate.some(t => typeof t !== 'string' || !t.trim()))
108
+ return fallback('invalid', Date.now() - started);
109
+ const joined = candidate.join('\n'), limit = surface === 'public-comment' ? Math.min(2000, Math.max(120, draft.length)) : companion.characterCard.length === 'short' ? 180 : 2000;
110
+ if (joined.length > limit || options.single && /[\r\n]/.test(joined) || tokens(draft).some(t => !joined.includes(t)) || tokens(joined).some(t => !draft.includes(t)))
111
+ return fallback('content-check', Date.now() - started);
112
+ const hasStickers = parts.some(p => 'stickerId' in p);
113
+ if (hasStickers && candidate.length !== texts.length)
114
+ return fallback('part-order', Date.now() - started);
115
+ let index = 0;
116
+ const rendered = parseChatInput({ messages: hasStickers ? parts.map(p => 'text' in p ? { text: candidate[index++] } : p) : candidate.map(text => ({ text })) });
117
+ return { parts: rendered, validate: check, audit: { status: 'rendered', surface, durationMs: Date.now() - started } };
118
+ }
119
+ catch {
120
+ return fallback(signal.aborted ? 'aborted' : 'invalid', Date.now() - started);
121
+ }
122
+ finally {
123
+ unsubscribe?.();
124
+ }
125
+ })();
126
+ entries.set(key, job);
127
+ return job;
128
+ }
129
+ //# sourceMappingURL=persona-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-delivery.js","sourceRoot":"","sources":["../../src/chat/persona-delivery.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;;EA6CzD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAIrI"}
@@ -45,6 +45,7 @@ export function replyContinuity(sessionId, events, sessions) {
45
45
  const prefix = [];
46
46
  const callOrigins = new Map();
47
47
  let eventRoute;
48
+ let finalText = '';
48
49
  for (const event of events) {
49
50
  prefix.push(event);
50
51
  if (event.type === 'user/message' && event.data.source.kind === 'user')
@@ -56,6 +57,17 @@ export function replyContinuity(sessionId, events, sessions) {
56
57
  if (event.seq < since)
57
58
  continue;
58
59
  const sameRoute = eventRoute?.id === route?.id;
60
+ // Only a completed terminal plain response is visible conversation. Intermediate
61
+ // planner prose beside/before tools must never become a voice example.
62
+ if (event.type === 'turn/start' || event.type === 'user/message' && event.data.source.kind === 'user' || event.type === 'tool/call' || event.type === 'tool/result' || event.type === 'tool/ptc-dispatch')
63
+ finalText = '';
64
+ if (event.type === 'assistant/message')
65
+ finalText = sameRoute && !event.data.interrupted && !event.data.message.content.some(b => b.type === 'tool-call') ? textOf(event.data.message.content) : '';
66
+ if (event.type === 'turn/end') {
67
+ if (sameRoute && event.data.reason.kind === 'completed' && finalText.trim() && dialogue.at(-1)?.text !== finalText)
68
+ dialogue.push({ role: 'assistant', text: finalText });
69
+ finalText = '';
70
+ }
59
71
  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
72
  const progressForRoute = progressCallId && callOrigins.has(progressCallId) && callOrigins.get(progressCallId) === route?.id;
61
73
  if (progressForRoute && progress.has(event.seq)) {
@@ -1 +1 @@
1
- {"version":3,"file":"reply-continuity.js","sourceRoot":"","sources":["../../src/chat/reply-continuity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reply-continuity.js","sourceRoot":"","sources":["../../src/chat/reply-continuity.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/chat/tools.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAM5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAK1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAqB,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEzE,wBAAgB,SAAS,CAAC,KAAK,EAAC,MAAM,EAAE,KAAK,EAAC,YAAY,EAAE,OAAO,EAAC,cAAc,EAAE,UAAU,EAAC,yBAAyB,EAAE,GAAG,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,EAAE,QAAQ,kBAA6B,GAAE,cAAc,EAAE,CAqI5M"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/chat/tools.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAM5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAK1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAqB,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEzE,wBAAgB,SAAS,CAAC,KAAK,EAAC,MAAM,EAAE,KAAK,EAAC,YAAY,EAAE,OAAO,EAAC,cAAc,EAAE,UAAU,EAAC,yBAAyB,EAAE,GAAG,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,EAAE,QAAQ,kBAA6B,GAAE,cAAc,EAAE,CAmJ5M"}
package/lib/chat/tools.js CHANGED
@@ -1,9 +1,12 @@
1
- import { checkShortExpression } from './short-expression.js';
1
+ import { renderPersonaDelivery } from './persona-delivery.js';
2
+ import { createHash } from 'node:crypto';
3
+ import { deliverIntermediate } from './intermediate-delivery.js';
4
+ import { usesShortDeliveryPolicy } from '../character/conversation-behavior.js';
2
5
  import { pendingActions, pendingActionNotice, validateTaskStop } from './action-obligation.js';
3
6
  import { hasTaskPreamble } from '../execution/task-preamble.js';
4
7
  import { hasCurrentSpeech } from './live-speech.js';
5
8
  import { assertChatImageDelivery } from './attachment-reference.js';
6
- import { composeWorkExpression, workExpressionEvidence, WORK_REPLY_SCHEMA } from './work-expression.js';
9
+ import { composeWorkExpression, composeConversationExpression, CONVERSATION_EXPRESSION_SCHEMA, workExpressionEvidence, WORK_REPLY_SCHEMA } from './work-expression.js';
7
10
  import { qqGroupPeer, qqSettings } from '../channels/qq/settings.js';
8
11
  import { isIdleContactNotice } from '../character/idle-contact.js';
9
12
  import { mkdtemp, writeFile, rm } from 'node:fs/promises';
@@ -72,8 +75,8 @@ export function chatTools(owner, store, library, deliveries, ctx, prefix, adapte
72
75
  return { content: [{ type: 'text', text: JSON.stringify(item) }, { type: 'image', attachment }] };
73
76
  },
74
77
  }, {
75
- name: 'partner_chat_reply', description: `提交本轮最终聊天回复并结束回合。本轮已用 partner_chat_say 送达普通接话或结果对白且没有新话时可提交 messages:[] 结束,不重复已说内容;仅任务前动作告知不能代替结果答复。自主群聊确实无需接话时可提交 messages:[] 安静结束,不发送旁听提示;明确呼唤和正常接续优先回应。其他场景 messages 是按顺序展示/发送的 1–8 条消息,每条只含 text 或 stickerId;开启分段时按自然语意与停顿使用多个 text 条目,同一话题也可分条;一句短话保持一条,不为凑段数增加内容。每个 text 是一条消息;开启分段时单个短聊天 text 内的换行会兜底分条,代码、列表与长文保持完整;分段关闭时文字只用一条,最多两张库内表情。先完成所有必要工作,再调用本工具;不要同时安排其他工具,直接回复时所有要说的文字都放在 messages 的 text 条目中,表情放在独立的 stickerId 条目;生成图片和文件先用 partner_send_attachment 真实交付,text 不得代发本地 Markdown 图片地址;不要把文字放在工具外、只在 messages 里提交表情。不在调用前后重复相同文字。messages 是你直接按人格写出的回复,原样使用,不会自动改写。短句接话普通每条以 20 字以内、一次最终文字以 48 字以内为目标;偏长时会提醒重写一次,不截字。普通正文超过 180 字仍会退回要求文档交付,不会截断;明确的本轮展开要求或附件失败回退使用 inlineDetails。短句接话时长任务结果先通过 partner_send_attachment 交付文档,再直接用 messages 自然接话,不汇总结论,不使用 workReply 二次表达;简单结果直接 messages,本轮明确要求详细或不要附件则按请求回应。其他节奏需要答复本轮工作结果时可使用 workReply 交接:只写当前回应目的(不列提纲或复述工作细节),并引用本轮真实 runId 的数组下标,不先写成稿;此时 messages 只能附带表情。用户换话题可直接 messages 回应,不强制交接工作。未知和失败不会因未选下标而消失。无需分段的长文/代码可用普通最终回复。适用于直接对话或系统明确发起的闲时联系,不用于内部任务或心跳。表情先调用 partner_stickers 查询当前渠道的库,优先选择结果中的渠道原生表情;QQ 渠道库优先挑已收藏表情;只用当前查询返回的 ID,没有贴切结果可去掉 query 浏览,仍不合适就只发文字,不强行每轮发表情,不自行换成内置库。`,
76
- parameters: { type: 'object', properties: { taskEvidence: { type: 'object', additionalProperties: false, required: ['kind'], properties: { kind: { type: 'string', enum: ['not_executed', 'tool_error'], description: '未调用或模型自己不能执行用 not_executed,不能说成外部服务拒绝;真实工具失败用 tool_error。' }, callId: { type: 'string', maxLength: 300 }, excerpt: { type: 'string', maxLength: 500, description: '实际工具错误返回的原文片段,必须与 callId 对应。' } }, description: 'taskDisposition=blocked 时必填,区分未执行与有证据的工具失败;不得虚构回执。' }, taskDisposition: { type: 'string', enum: ['blocked'], description: '本轮已告知的动作无法继续(取消、权限或条件限制)时明确结束,不能声称完成。' }, taskReason: { type: 'string', minLength: 1, maxLength: 300, description: '未执行动作的具体原因;同时在 messages 按人格说明未完成。' }, inlineDetails: { type: 'boolean', description: '仅当用户本轮明确要求详细、原文、不要附件,或附件能力不可用/投递失败而必须在正文交付时设为 true;短句模式普通长回复应先交付文档,不用此字段绕过节奏。' }, workReply: WORK_REPLY_SCHEMA, preserveText: { type: 'boolean', description: '用户要求原文、逐字引用或固定文本时为 true;不用于省略工作。' }, messages: { type: 'array', minItems: 0, maxItems: 8, items: { type: 'object', properties: { text: { type: 'string', maxLength: 6000 }, stickerId: { type: 'string' } }, additionalProperties: false } } }, additionalProperties: false },
78
+ name: 'partner_chat_reply', description: `提交聊天消息,默认作为最终收尾并结束回合。执行多个目标期间可设 continueTurn:true,立即发送这些文字或表情后继续工作,不结束回合;没有新话无需调用。本轮已用 partner_chat_say 送达普通接话或结果对白且没有新话时可提交 messages:[] 结束,不重复已说内容;仅任务前动作告知不能代替结果答复。自主群聊确实无需接话时可提交 messages:[] 安静结束,不发送旁听提示;明确呼唤和正常接续优先回应。其他场景 messages 是按顺序展示/发送的 1–8 条消息,每条只含 text 或 stickerId;开启分段时按自然语意与停顿使用多个 text 条目,同一话题也可分条;一句短话保持一条,不为凑段数增加内容。每个 text 是一条消息;开启分段时单个短聊天 text 内的换行会兜底分条,代码、列表与长文保持完整;分段关闭时文字只用一条,最多两张库内表情。最终收尾前先完成所有必要工作;中途消息确认送达后再继续执行,不与发送并行安排其他工具,直接回复时所有要说的文字都放在 messages 的 text 条目中,表情放在独立的 stickerId 条目;生成图片和文件先用 partner_send_attachment 真实交付,text 不得代发本地 Markdown 图片地址;不要把文字放在工具外、只在 messages 里提交表情。不在调用前后重复相同文字。工作中与结果发言优先用 expression:只说明本次回应意图,sourceCalls 引用本轮真实工具结果(含失败),由只读表达器结合当前人物、关系与近期双方聊天生成正文;不执行工具、不补任务。长工作结果用 workReply 精选真实事实。expression/workReply 与文字成稿互斥,messages 可另附表情。表达器失败未发送时,直接用 messages 回复,不重复交接。messages 中的普通文字会在投递前按当前人物生成实际正文;用户指定原文用 preserveText:true(原文须能在当前用户消息中核对),代码和明确要求详细时保持原稿。生成不可用时原稿回退,不重跑任务。普通接话按当前人格自然表达,不为了凑段数额外补话。直接成稿依据人物和关系设定写入 messages。长任务过程和结论先用有具体主题文件名的报告交付,再按人格自然收尾,只接住最相关的结果或发现,不再复述报告提纲、验证过程和整套限制;影响用户判断的失败和不确定性简短说清,追问再展开。中途接话不要求先交报告。短句设置对独占人格也有效,聊天正文最多 180 字,多个意思分成多个 text 条目,不强制条数、不截断。明确要求详细或附件失败回退用 inlineDetails。包括独占模式在内均可 workReply 交接:只写当前回应目的(不列提纲或复述工作细节),并引用本轮真实 runId 的数组下标,不先写成稿;此时 messages 只能附带表情。用户换话题可直接 messages 回应,不强制交接工作。未知和失败不会因未选下标而消失。无需分段的长文/代码可用普通最终回复。适用于直接对话或系统明确发起的闲时联系,不用于内部任务或心跳。表情先调用 partner_stickers 查询当前渠道的库,优先选择结果中的渠道原生表情;QQ 渠道库优先挑已收藏表情;只用当前查询返回的 ID,没有贴切结果可去掉 query 浏览,仍不合适就只发文字,不强行每轮发表情,不自行换成内置库。`,
79
+ parameters: { type: 'object', properties: { expression: CONVERSATION_EXPRESSION_SCHEMA, continueTurn: { type: 'boolean', description: 'true:立即发送中途文字或表情,然后继续当前回合;默认 false:最终收尾。' }, taskEvidence: { type: 'object', additionalProperties: false, required: ['kind'], properties: { kind: { type: 'string', enum: ['not_executed', 'tool_error'], description: '未调用或模型自己不能执行用 not_executed,不能说成外部服务拒绝;真实工具失败用 tool_error。' }, callId: { type: 'string', maxLength: 300 }, excerpt: { type: 'string', maxLength: 500, description: '实际工具错误返回的原文片段,必须与 callId 对应。' } }, description: 'taskDisposition=blocked 时必填,区分未执行与有证据的工具失败;不得虚构回执。' }, taskDisposition: { type: 'string', enum: ['blocked'], description: '本轮已告知的动作无法继续(取消、权限或条件限制)时明确结束,不能声称完成。' }, taskReason: { type: 'string', minLength: 1, maxLength: 300, description: '未执行动作的具体原因;同时在 messages 按人格说明未完成。' }, inlineDetails: { type: 'boolean', description: '仅当用户本轮明确要求详细、原文、不要附件,或附件能力不可用/投递失败而必须在正文交付时设为 true;短句模式普通长回复应先交付文档,不用此字段绕过节奏。' }, workReply: WORK_REPLY_SCHEMA, preserveText: { type: 'boolean', description: '用户要求原文、逐字引用或固定文本时为 true;不用于省略工作。' }, messages: { type: 'array', minItems: 0, maxItems: 8, items: { type: 'object', properties: { text: { type: 'string', maxLength: 6000 }, stickerId: { type: 'string' } }, additionalProperties: false } } }, additionalProperties: false },
77
80
  output: { schema: { type: 'object' }, render: (_args, value) => [{ type: 'text', text: value.parts.map(p => p.type === 'text' ? p.text : `[表情:${p.type === 'emoji' ? p.emoji.label : p.label}]`).join('\n\n') }], presentationMeta: (_args, value) => value },
78
81
  presentCall: () => ({ card: 'generic', title: '回复' }),
79
82
  async execute(raw, exec) {
@@ -90,8 +93,10 @@ export function chatTools(owner, store, library, deliveries, ctx, prefix, adapte
90
93
  const origin = [...events].reverse().find(e => e.seq > currentStart && e.type === 'user/message' && !isRequirementDeliveryReceipt(e) && (e.data.source.kind === 'user' || isInternalTaskNotice(e) || isIdleContactNotice(e)));
91
94
  if (!origin || isInternalTaskNotice(origin))
92
95
  throw new Error('内部任务或自动执行不能用聊天回复结束;请按原任务协议交付');
93
- let shortWorkDelivered = false;
94
- if (card.length === 'short' && raw.inlineDetails !== true) {
96
+ const continuing = raw.continueTurn === true;
97
+ if (continuing && raw.taskDisposition !== undefined)
98
+ throw Error('中途接话不提交任务结束状态');
99
+ if (!continuing && raw.inlineDetails !== true) {
95
100
  const reports = workExpressionEvidence(events, currentStart).reports;
96
101
  const longRuns = reports.filter(r => JSON.stringify(r).length > 1200).map(r => r.runId);
97
102
  const delivered = new Set();
@@ -120,18 +125,17 @@ export function chatTools(owner, store, library, deliveries, ctx, prefix, adapte
120
125
  }
121
126
  }
122
127
  if (longRuns.some(id => !delivered.has(id)))
123
- throw Error('短句接话:本轮长任务报告尚未交付,聊天未发送、未结束。先调用 partner_send_attachment workReport.runIds=' + JSON.stringify(longRuns.filter(id => !delivered.has(id))) + ' 保存并交付完整记录,再用 messages 按人格自然接半句或一句,不汇总结果。用户本轮明确要求不要附件或附件失败时用 inlineDetails:true 正文交付。');
124
- shortWorkDelivered = longRuns.length > 0;
128
+ throw Error('短句接话:本轮长任务报告尚未交付,最终聊天未发送、未结束。先调用 partner_send_attachment workReport.runIds=' + JSON.stringify(longRuns.filter(id => !delivered.has(id))) + ',name 填任务主题文件名,保存并交付完整记录,再用 messages 按人物设定收尾,可自然分条。用户本轮明确要求不要附件或附件失败时用 inlineDetails:true 正文交付。');
125
129
  }
126
130
  const disposition = raw;
127
131
  const missing = pendingActions(events);
128
132
  if (disposition.taskDisposition === 'blocked' && (!disposition.taskReason?.trim() || !disposition.messages?.some(p => p.text?.trim())))
129
133
  throw Error('无法继续时需 taskReason 具体原因和 messages 中对用户的说明,不能静默结束或声称完成。');
130
134
  const stopEvidence = disposition.taskDisposition === 'blocked' ? validateTaskStop(events, disposition.taskEvidence) : undefined;
131
- if (missing.length && disposition.taskDisposition !== 'blocked')
135
+ if (!continuing && missing.length && disposition.taskDisposition !== 'blocked')
132
136
  throw Error(pendingActionNotice(missing));
133
137
  const messages = raw?.messages;
134
- if (raw.workReply === undefined && Array.isArray(messages) && messages.length === 0) {
138
+ if (!continuing && raw.workReply === undefined && raw.expression === undefined && Array.isArray(messages) && messages.length === 0) {
135
139
  const audience = questionOrigin(agent.session.id, events, state.sessions);
136
140
  if (hasCurrentSpeech(events) && audience) {
137
141
  exec.signal.throwIfAborted();
@@ -149,18 +153,25 @@ export function chatTools(owner, store, library, deliveries, ctx, prefix, adapte
149
153
  return { kind: 'partner-chat-v1', parts: [], silent: true, originRouteId: audience.id };
150
154
  }
151
155
  const selection = raw.workReply;
152
- const original = selection === undefined ? withChatCompanionText(parseChatInput(raw), events, exec.rootCallId ?? exec.callId) : messages === undefined || Array.isArray(messages) && messages.length === 0 ? [] : parseChatInput(raw);
153
- const authored = await composeWorkExpression(ctx, owner, store, exec, original, selection);
154
- if (card.length === 'short' && raw.inlineDetails !== true && authored.parts.reduce((n, p) => n + ('text' in p ? p.text.length : 0), 0) > 180) {
155
- throw Error('短句接话:本次正文超过 180 字,尚未发送或结束回合。不要截断内容;先调用 partner_send_attachment,以 workReport.runIds 交付本轮完整工作记录,或 document.name/content 保存长文,再用 messages 按人格自然接半句或一句,不汇总结果,不重复报告。若用户明确要求详细/原文/不要附件,或附件不可用/发送失败需要正文交付,使用 inlineDetails:true。');
156
+ const expression = raw.expression;
157
+ if (selection !== undefined && expression !== undefined)
158
+ throw Error('expression 与 workReply 只选一种,不同时提交');
159
+ const original = selection === undefined && expression === undefined ? withChatCompanionText(parseChatInput(raw), events, exec.rootCallId ?? exec.callId) : messages === undefined || Array.isArray(messages) && messages.length === 0 ? [] : parseChatInput(raw);
160
+ let authored = expression !== undefined ? await composeConversationExpression(ctx, owner, store, exec, original, expression) : await composeWorkExpression(ctx, owner, store, exec, original, selection);
161
+ if (usesShortDeliveryPolicy(card) && raw.inlineDetails !== true && authored.parts.reduce((n, p) => n + ('text' in p ? p.text.length : 0), 0) > 180)
162
+ throw Error('短句接话:本次正文超过 180 字,尚未发送或结束回合。先交付完整报告或文档;用户明确要求详细/原文或附件失败时用 inlineDetails:true。');
163
+ let personaDelivery;
164
+ if (expression === undefined && selection === undefined) {
165
+ const voiced = await renderPersonaDelivery(ctx, owner, store, exec, authored.parts, { preserveText: raw.preserveText === true, inlineDetails: raw.inlineDetails === true });
166
+ authored = { ...authored, parts: voiced.parts, ...(voiced.validate ? { validate: voiced.validate } : {}) };
167
+ personaDelivery = voiced.audit;
168
+ }
169
+ if (usesShortDeliveryPolicy(card) && raw.inlineDetails !== true && authored.parts.reduce((n, p) => n + ('text' in p ? p.text.length : 0), 0) > 180) {
170
+ throw Error('短句接话:本次正文超过 180 字,尚未发送或结束回合。不要截断内容;先调用 partner_send_attachment,以 workReport.runIds 交付本轮完整工作记录,或 document.name/content 保存长文,再用 messages 按人物设定接话,可按自然停顿分条。若用户明确要求详细/原文/不要附件,或附件不可用/发送失败需要正文交付,使用 inlineDetails:true。');
156
171
  }
157
172
  for (const part of authored.parts)
158
173
  if ('text' in part)
159
174
  assertChatImageDelivery(part.text);
160
- const textParts = authored.parts.filter(p => 'text' in p);
161
- checkShortExpression(agent, events, textParts.flatMap(p => 'text' in p ? [p.text] : []), 'final', card.length === 'short', raw.inlineDetails === true || raw.preserveText === true);
162
- if (shortWorkDelivered && (textParts.length > 1 || textParts.some(p => 'text' in p && /[\r\n]/.test(p.text))))
163
- throw Error('完整报告已经交付。短句接话的工作结果请用 messages 一条不换行的自然接话,回应完成、未完成或交付这件事,不汇总结论。结果、过程和限制已经在附件里,只有需要对方立即决定或附件失败才补充必要说明。不截断旧文,请重新按人格说一句。用户明确要展开时使用 inlineDetails:true。');
164
175
  const input = segmentChatInput(authored.parts, Boolean(card.segmentedReplies));
165
176
  if (!card.segmentedReplies && input.filter(p => 'text' in p).length > 1)
166
177
  throw new Error('分段回复未开启,请使用一条文字');
@@ -198,8 +209,19 @@ export function chatTools(owner, store, library, deliveries, ctx, prefix, adapte
198
209
  throw new Error('聊天方式已变更,请按新设置回复');
199
210
  exec.signal.throwIfAborted();
200
211
  authored.validate?.();
212
+ if (continuing) {
213
+ const originRouteId = questionOrigin(agent.session.id, events, state.sessions)?.id;
214
+ if (!originRouteId || origin.type !== 'user/message' || origin.data.source.kind !== 'user')
215
+ throw Error('中途消息需要当前用户会话来源');
216
+ const currentInput = [...agent.session.snapshotEvents()].reverse().find(e => e.type === 'user/message' && e.data.source.kind === 'user');
217
+ if (currentInput?.type !== 'user/message' || currentInput.data.id !== origin.data.id)
218
+ throw Error('输入已变化,旧中途消息未发送,请先处理新输入');
219
+ const receipt = 'intermediate:' + createHash('sha256').update(JSON.stringify([agent.session.id, origin.data.id, parts])).digest('hex');
220
+ await deliverIntermediate(agent, parts, originRouteId, receipt);
221
+ return { kind: 'partner-chat-v1', parts, intermediate: true, delivered: true, ...(authored.audit ? { workExpression: authored.audit } : {}), ...(personaDelivery ? { personaDelivery } : {}), inputMessageId: origin.data.id, originRouteId };
222
+ }
201
223
  exec.concludeTurn();
202
- return { kind: 'partner-chat-v1', parts, ...(disposition.taskDisposition === 'blocked' ? { taskDisposition: 'blocked', taskEvidence: stopEvidence } : {}), originRouteId: questionOrigin(agent.session.id, events, state.sessions)?.id ?? null, ...(authored.audit ? { workExpression: authored.audit } : {}) };
224
+ return { kind: 'partner-chat-v1', parts, ...(disposition.taskDisposition === 'blocked' ? { taskDisposition: 'blocked', taskEvidence: stopEvidence } : {}), originRouteId: questionOrigin(agent.session.id, events, state.sessions)?.id ?? null, ...(authored.audit ? { workExpression: authored.audit } : {}), ...(personaDelivery ? { personaDelivery } : {}) };
203
225
  },
204
226
  }];
205
227
  }