@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.
- package/README.md +5 -0
- package/docs/channel-activities.md +56 -0
- package/docs/compatibility-0.2.2-rc.1.md +7 -0
- package/docs/releases/2.23.41.md +9 -0
- package/docs/releases/2.23.42.md +11 -0
- package/docs/releases/2.23.43.md +13 -0
- package/docs/releases/2.23.44.md +13 -0
- package/docs/releases/2.23.45.md +11 -0
- package/docs/releases/2.23.46.md +5 -0
- package/docs/releases/2.23.47.md +5 -0
- package/docs/releases/2.23.48.md +6 -0
- package/docs/releases/2.23.49.md +6 -0
- package/docs/releases/2.23.50.md +6 -0
- package/docs/releases/2.23.51.md +5 -0
- package/docs/releases/2.23.52.md +7 -0
- package/docs/releases/2.23.53.md +5 -0
- package/docs/releases/2.23.54.md +7 -0
- package/docs/releases/2.24.0-rc.2.md +9 -0
- package/docs/releases/2.24.0-rc.3.md +6 -0
- package/docs/releases/2.24.0-rc.4.md +11 -0
- package/docs/releases/2.24.0-rc.5.md +11 -0
- package/docs/releases/2.24.0-rc.6.md +12 -0
- package/docs/releases/2.24.0-rc.9.md +5 -0
- package/lib/agent-runtime.d.ts +5 -2
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +204 -85
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api.d.ts +1 -0
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +69 -2
- package/lib/api.js.map +1 -1
- package/lib/attachments/reply-document.d.ts +5 -0
- package/lib/attachments/reply-document.d.ts.map +1 -1
- package/lib/attachments/reply-document.js +7 -3
- package/lib/attachments/reply-document.js.map +1 -1
- package/lib/attachments/tool.d.ts +1 -1
- package/lib/attachments/tool.d.ts.map +1 -1
- package/lib/attachments/tool.js +2 -2
- package/lib/attachments/tool.js.map +1 -1
- package/lib/channels/activity-defaults.d.ts +4 -0
- package/lib/channels/activity-defaults.d.ts.map +1 -0
- package/lib/channels/activity-defaults.js +15 -0
- package/lib/channels/activity-defaults.js.map +1 -0
- package/lib/channels/activity-registry.d.ts +37 -0
- package/lib/channels/activity-registry.d.ts.map +1 -0
- package/lib/channels/activity-registry.js +53 -0
- package/lib/channels/activity-registry.js.map +1 -0
- package/lib/channels/bilibili/activity-provider.d.ts +3 -0
- package/lib/channels/bilibili/activity-provider.d.ts.map +1 -0
- package/lib/channels/bilibili/activity-provider.js +8 -0
- package/lib/channels/bilibili/activity-provider.js.map +1 -0
- package/lib/channels/bilibili/catalog.d.ts +23 -0
- package/lib/channels/bilibili/catalog.d.ts.map +1 -0
- package/lib/channels/bilibili/catalog.js +45 -0
- package/lib/channels/bilibili/catalog.js.map +1 -0
- package/lib/channels/bilibili/media.d.ts +9 -0
- package/lib/channels/bilibili/media.d.ts.map +1 -0
- package/lib/channels/bilibili/media.js +67 -0
- package/lib/channels/bilibili/media.js.map +1 -0
- package/lib/channels/bilibili/service.d.ts +37 -0
- package/lib/channels/bilibili/service.d.ts.map +1 -0
- package/lib/channels/bilibili/service.js +138 -0
- package/lib/channels/bilibili/service.js.map +1 -0
- package/lib/channels/bilibili/tools.d.ts +6 -0
- package/lib/channels/bilibili/tools.d.ts.map +1 -0
- package/lib/channels/bilibili/tools.js +48 -0
- package/lib/channels/bilibili/tools.js.map +1 -0
- package/lib/channels/direct/message-format.js +298 -206
- package/lib/channels/direct/message-format.js.map +4 -4
- package/lib/channels/manager.d.ts +1 -0
- package/lib/channels/manager.d.ts.map +1 -1
- package/lib/channels/manager.js +48 -5
- package/lib/channels/manager.js.map +1 -1
- package/lib/channels/qq/action-catalog.js +2 -2
- package/lib/channels/qq/action-catalog.js.map +1 -1
- package/lib/channels/qq/actions.d.ts +2 -1
- package/lib/channels/qq/actions.d.ts.map +1 -1
- package/lib/channels/qq/actions.js +14 -2
- package/lib/channels/qq/actions.js.map +1 -1
- package/lib/channels/qq/activity-provider.d.ts +4 -0
- package/lib/channels/qq/activity-provider.d.ts.map +1 -0
- package/lib/channels/qq/activity-provider.js +21 -0
- package/lib/channels/qq/activity-provider.js.map +1 -0
- package/lib/channels/qq/authority.d.ts +1 -1
- package/lib/channels/qq/authority.d.ts.map +1 -1
- package/lib/channels/qq/authority.js +3 -3
- package/lib/channels/qq/authority.js.map +1 -1
- package/lib/channels/qq/connection.d.ts +5 -0
- package/lib/channels/qq/connection.d.ts.map +1 -1
- package/lib/channels/qq/connection.js +12 -2
- package/lib/channels/qq/connection.js.map +1 -1
- package/lib/channels/qq/message.d.ts.map +1 -1
- package/lib/channels/qq/message.js +11 -1
- package/lib/channels/qq/message.js.map +1 -1
- package/lib/channels/qq/reply-tool.d.ts.map +1 -1
- package/lib/channels/qq/reply-tool.js +62 -6
- package/lib/channels/qq/reply-tool.js.map +1 -1
- package/lib/channels/weixin/connect.d.ts +3 -1
- package/lib/channels/weixin/connect.d.ts.map +1 -1
- package/lib/character/activity-journal.d.ts +20 -0
- package/lib/character/activity-journal.d.ts.map +1 -0
- package/lib/character/activity-journal.js +78 -0
- package/lib/character/activity-journal.js.map +1 -0
- package/lib/character/activity-plan.d.ts +27 -0
- package/lib/character/activity-plan.d.ts.map +1 -0
- package/lib/character/activity-plan.js +47 -0
- package/lib/character/activity-plan.js.map +1 -0
- package/lib/character/activity-tool.d.ts.map +1 -1
- package/lib/character/activity-tool.js +24 -4
- package/lib/character/activity-tool.js.map +1 -1
- package/lib/character/affection-tool.js +4 -4
- package/lib/character/affection-tool.js.map +1 -1
- package/lib/character/affection.d.ts +8 -43
- package/lib/character/affection.d.ts.map +1 -1
- package/lib/character/affection.js +7 -24
- package/lib/character/affection.js.map +1 -1
- package/lib/character/background-context.d.ts +6 -0
- package/lib/character/background-context.d.ts.map +1 -0
- package/lib/character/background-context.js +29 -0
- package/lib/character/background-context.js.map +1 -0
- package/lib/character/conversation-behavior.d.ts +2 -0
- package/lib/character/conversation-behavior.d.ts.map +1 -1
- package/lib/character/conversation-behavior.js +16 -12
- package/lib/character/conversation-behavior.js.map +1 -1
- package/lib/character/domain.d.ts +10 -0
- package/lib/character/domain.d.ts.map +1 -1
- package/lib/character/domain.js +7 -0
- package/lib/character/domain.js.map +1 -1
- package/lib/character/habit-tool.d.ts +4 -0
- package/lib/character/habit-tool.d.ts.map +1 -0
- package/lib/character/habit-tool.js +31 -0
- package/lib/character/habit-tool.js.map +1 -0
- package/lib/character/habits.d.ts +38 -0
- package/lib/character/habits.d.ts.map +1 -0
- package/lib/character/habits.js +92 -0
- package/lib/character/habits.js.map +1 -0
- package/lib/character/idle-contact.d.ts +11 -4
- package/lib/character/idle-contact.d.ts.map +1 -1
- package/lib/character/idle-contact.js +28 -49
- package/lib/character/idle-contact.js.map +1 -1
- package/lib/character/interaction-review.d.ts +44 -0
- package/lib/character/interaction-review.d.ts.map +1 -0
- package/lib/character/interaction-review.js +141 -0
- package/lib/character/interaction-review.js.map +1 -0
- package/lib/character/post-reply.d.ts +1 -3
- package/lib/character/post-reply.d.ts.map +1 -1
- package/lib/character/post-reply.js +15 -18
- package/lib/character/post-reply.js.map +1 -1
- package/lib/character/prompt-projection.d.ts +1 -0
- package/lib/character/prompt-projection.d.ts.map +1 -1
- package/lib/character/prompt-projection.js +8 -1
- package/lib/character/prompt-projection.js.map +1 -1
- package/lib/character/thought-tool.d.ts +4 -0
- package/lib/character/thought-tool.d.ts.map +1 -0
- package/lib/character/thought-tool.js +99 -0
- package/lib/character/thought-tool.js.map +1 -0
- package/lib/character/thoughts.d.ts +42 -0
- package/lib/character/thoughts.d.ts.map +1 -0
- package/lib/character/thoughts.js +91 -0
- package/lib/character/thoughts.js.map +1 -0
- package/lib/chat/context-selection.d.ts.map +1 -1
- package/lib/chat/context-selection.js +5 -2
- package/lib/chat/context-selection.js.map +1 -1
- package/lib/chat/intermediate-delivery.d.ts +7 -0
- package/lib/chat/intermediate-delivery.d.ts.map +1 -0
- package/lib/chat/intermediate-delivery.js +14 -0
- package/lib/chat/intermediate-delivery.js.map +1 -0
- package/lib/chat/live-speech.d.ts +5 -2
- package/lib/chat/live-speech.d.ts.map +1 -1
- package/lib/chat/live-speech.js +39 -12
- package/lib/chat/live-speech.js.map +1 -1
- package/lib/chat/persona-delivery.d.ts +29 -0
- package/lib/chat/persona-delivery.d.ts.map +1 -0
- package/lib/chat/persona-delivery.js +129 -0
- package/lib/chat/persona-delivery.js.map +1 -0
- package/lib/chat/reply-continuity.d.ts.map +1 -1
- package/lib/chat/reply-continuity.js +12 -0
- package/lib/chat/reply-continuity.js.map +1 -1
- package/lib/chat/tools.d.ts.map +1 -1
- package/lib/chat/tools.js +41 -19
- package/lib/chat/tools.js.map +1 -1
- package/lib/chat/work-expression.d.ts +36 -0
- package/lib/chat/work-expression.d.ts.map +1 -1
- package/lib/chat/work-expression.js +80 -15
- package/lib/chat/work-expression.js.map +1 -1
- package/lib/client-api.d.ts +14 -1
- package/lib/client-api.d.ts.map +1 -1
- package/lib/client-api.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +9670 -13202
- package/lib/client.js.map +4 -4
- package/lib/collaboration/composition.d.ts.map +1 -1
- package/lib/collaboration/composition.js +6 -2
- package/lib/collaboration/composition.js.map +1 -1
- package/lib/collaboration/tool-discovery.d.ts.map +1 -1
- package/lib/collaboration/tool-discovery.js +12 -6
- package/lib/collaboration/tool-discovery.js.map +1 -1
- package/lib/companions/identity-tool.d.ts +1 -1
- package/lib/companions/identity-tool.d.ts.map +1 -1
- package/lib/companions/identity-tool.js +3 -4
- package/lib/companions/identity-tool.js.map +1 -1
- package/lib/companions/identity.js +4 -4
- package/lib/companions/identity.js.map +1 -1
- package/lib/companions/persona-refinement.d.ts.map +1 -1
- package/lib/companions/persona-refinement.js +1 -45
- package/lib/companions/persona-refinement.js.map +1 -1
- package/lib/compat/native-presentation.d.ts +4 -0
- package/lib/compat/native-presentation.d.ts.map +1 -0
- package/lib/compat/native-presentation.js +40 -0
- package/lib/compat/native-presentation.js.map +1 -0
- package/lib/compat/ptc-events.d.ts +2 -0
- package/lib/compat/ptc-events.d.ts.map +1 -0
- package/lib/compat/ptc-events.js +2 -0
- package/lib/compat/ptc-events.js.map +1 -0
- package/lib/compat/tool-dispatch.d.ts +4 -0
- package/lib/compat/tool-dispatch.d.ts.map +1 -0
- package/lib/compat/tool-dispatch.js +14 -0
- package/lib/compat/tool-dispatch.js.map +1 -0
- package/lib/concern-tool.d.ts.map +1 -1
- package/lib/concern-tool.js +5 -3
- package/lib/concern-tool.js.map +1 -1
- package/lib/domain.d.ts +14 -1
- package/lib/domain.d.ts.map +1 -1
- package/lib/domain.js.map +1 -1
- package/lib/execution/agent-support.d.ts.map +1 -1
- package/lib/execution/agent-support.js +3 -1
- package/lib/execution/agent-support.js.map +1 -1
- package/lib/execution/operation-tool-access.d.ts.map +1 -1
- package/lib/execution/operation-tool-access.js +2 -6
- package/lib/execution/operation-tool-access.js.map +1 -1
- package/lib/execution/reply-progress.d.ts +1 -0
- package/lib/execution/reply-progress.d.ts.map +1 -1
- package/lib/execution/service.d.ts +2 -0
- package/lib/execution/service.d.ts.map +1 -1
- package/lib/execution/service.js +7 -1
- package/lib/execution/service.js.map +1 -1
- package/lib/execution/task-preamble.js +3 -3
- package/lib/execution/task-preamble.js.map +1 -1
- package/lib/execution/work-progress-card.d.ts +10 -0
- package/lib/execution/work-progress-card.d.ts.map +1 -0
- package/lib/execution/work-progress-card.js +45 -0
- package/lib/execution/work-progress-card.js.map +1 -0
- package/lib/execution/work-progress-state.d.ts +32 -0
- package/lib/execution/work-progress-state.d.ts.map +1 -0
- package/lib/execution/work-progress-state.js +19 -0
- package/lib/execution/work-progress-state.js.map +1 -0
- package/lib/execution/work-progress.d.ts +16 -0
- package/lib/execution/work-progress.d.ts.map +1 -0
- package/lib/execution/work-progress.js +76 -0
- package/lib/execution/work-progress.js.map +1 -0
- package/lib/execution/work-tool.d.ts.map +1 -1
- package/lib/execution/work-tool.js +64 -52
- package/lib/execution/work-tool.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +12 -4
- package/lib/index.js.map +1 -1
- package/lib/memory-domain.d.ts +5 -0
- package/lib/memory-domain.d.ts.map +1 -1
- package/lib/memory-reflection.d.ts +5 -1
- package/lib/memory-reflection.d.ts.map +1 -1
- package/lib/memory-reflection.js +21 -3
- package/lib/memory-reflection.js.map +1 -1
- package/lib/memory-store.d.ts +1 -1
- package/lib/observation-loop.d.ts.map +1 -1
- package/lib/observation-loop.js +17 -3
- package/lib/observation-loop.js.map +1 -1
- package/lib/persona/context.d.ts +4 -0
- package/lib/persona/context.d.ts.map +1 -0
- package/lib/persona/context.js +12 -0
- package/lib/persona/context.js.map +1 -0
- package/lib/persona/domain.d.ts +2 -1
- package/lib/persona/domain.d.ts.map +1 -1
- package/lib/persona/domain.js +11 -3
- package/lib/persona/domain.js.map +1 -1
- package/lib/persona/service.js +2 -2
- package/lib/persona/service.js.map +1 -1
- package/lib/persona/store.js +7 -7
- package/lib/persona/store.js.map +1 -1
- package/lib/persona/types.d.ts +3 -1
- package/lib/persona/types.d.ts.map +1 -1
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +23 -0
- package/lib/store.js.map +1 -1
- package/lib/ui/affection-panel.d.ts.map +1 -1
- package/lib/ui/affection-panel.js +2 -2
- package/lib/ui/affection-panel.js.map +1 -1
- package/lib/ui/bilibili-settings.d.ts +12 -0
- package/lib/ui/bilibili-settings.d.ts.map +1 -0
- package/lib/ui/bilibili-settings.js +77 -0
- package/lib/ui/bilibili-settings.js.map +1 -0
- package/lib/ui/channels-panel.d.ts.map +1 -1
- package/lib/ui/channels-panel.js +4 -3
- package/lib/ui/channels-panel.js.map +1 -1
- package/lib/ui/character-editor.d.ts.map +1 -1
- package/lib/ui/character-editor.js +4 -2
- package/lib/ui/character-editor.js.map +1 -1
- package/lib/ui/companion-vitals.js +1 -1
- package/lib/ui/companion-vitals.js.map +1 -1
- package/lib/ui/exclusive-prompt-toggle.d.ts +5 -0
- package/lib/ui/exclusive-prompt-toggle.d.ts.map +1 -0
- package/lib/ui/exclusive-prompt-toggle.js +7 -0
- package/lib/ui/exclusive-prompt-toggle.js.map +1 -0
- package/lib/ui/habits-panel.d.ts +4 -0
- package/lib/ui/habits-panel.d.ts.map +1 -0
- package/lib/ui/habits-panel.js +30 -0
- package/lib/ui/habits-panel.js.map +1 -0
- package/lib/ui/identity-editor.js +1 -8
- package/lib/ui/identity-editor.js.map +1 -1
- package/lib/ui/idle-contact-editor.d.ts.map +1 -1
- package/lib/ui/idle-contact-editor.js +4 -1
- package/lib/ui/idle-contact-editor.js.map +1 -1
- package/lib/ui/memory/persona-view.js +1 -1
- package/lib/ui/memory/persona-view.js.map +1 -1
- package/lib/ui/push-draft.d.ts +3 -3
- package/lib/ui/qq-capability-settings.js +1 -1
- package/lib/ui/qq-capability-settings.js.map +1 -1
- package/lib/ui/thoughts-panel.d.ts +4 -0
- package/lib/ui/thoughts-panel.d.ts.map +1 -0
- package/lib/ui/thoughts-panel.js +51 -0
- package/lib/ui/thoughts-panel.js.map +1 -0
- package/lib/ui/workspace-navigation.d.ts +16 -16
- package/package.json +82 -49
- package/resources/bilibili/Dockerfile +7 -0
- package/resources/bilibili/media.py +245 -0
- package/resources/bilibili/requirements.txt +3 -0
- package/resources/bilibili/server.py +300 -0
- package/resources/bilibili/test_bridge.py +115 -0
- package/resources/bilibili/test_media.py +110 -0
- package/lib/chat/short-expression.d.ts +0 -6
- package/lib/chat/short-expression.d.ts.map +0 -1
- package/lib/chat/short-expression.js +0 -24
- package/lib/chat/short-expression.js.map +0 -1
package/lib/chat/live-speech.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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: '
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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":"
|
|
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;;
|
|
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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"}
|
package/lib/chat/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/chat/tools.ts"],"names":[],"mappings":"
|
|
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 {
|
|
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:
|
|
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
|
-
|
|
94
|
-
if (
|
|
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('
|
|
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
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
}
|