@lemoncat7/dsh-partner 2.21.5 → 2.21.11
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/docs/THIRD_PARTY_LICENSES.md +1 -1
- package/docs/releases/2.21.10.md +5 -0
- package/docs/releases/2.21.11.md +7 -0
- package/docs/releases/2.21.6.md +6 -0
- package/docs/releases/2.21.7.md +11 -0
- package/docs/releases/2.21.8.md +9 -0
- package/docs/releases/2.21.9.md +6 -0
- package/lib/agent-runtime.d.ts +8 -1
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +62 -21
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +2 -1
- package/lib/api.js.map +1 -1
- package/lib/channels/direct/message-format.js +127 -127
- package/lib/channels/direct/message-format.js.map +1 -1
- package/lib/channels/qq/actions.js +1 -1
- package/lib/channels/qq/actions.js.map +1 -1
- package/lib/channels/qq/authority.d.ts +2 -1
- package/lib/channels/qq/authority.d.ts.map +1 -1
- package/lib/channels/qq/authority.js +4 -4
- package/lib/channels/qq/authority.js.map +1 -1
- package/lib/channels/qq/identity-binding.d.ts +1 -1
- package/lib/channels/qq/identity-binding.d.ts.map +1 -1
- package/lib/channels/qq/identity-binding.js +5 -3
- package/lib/channels/qq/identity-binding.js.map +1 -1
- package/lib/channels/qq/reply-tool.d.ts.map +1 -1
- package/lib/channels/qq/reply-tool.js +15 -4
- package/lib/channels/qq/reply-tool.js.map +1 -1
- package/lib/channels/qq/transport.js +1 -1
- package/lib/channels/qq/transport.js.map +1 -1
- package/lib/character/conversation-behavior.d.ts +3 -3
- package/lib/character/conversation-behavior.d.ts.map +1 -1
- package/lib/character/conversation-behavior.js +23 -22
- package/lib/character/conversation-behavior.js.map +1 -1
- package/lib/character/fatigue.d.ts +15 -0
- package/lib/character/fatigue.d.ts.map +1 -0
- package/lib/character/fatigue.js +37 -0
- package/lib/character/fatigue.js.map +1 -0
- package/lib/character/identity-guide.d.ts +38 -1
- package/lib/character/identity-guide.d.ts.map +1 -1
- package/lib/character/identity-guide.js +7 -1
- package/lib/character/identity-guide.js.map +1 -1
- package/lib/character/idle-contact.d.ts +1 -1
- package/lib/character/idle-contact.d.ts.map +1 -1
- package/lib/character/idle-contact.js +13 -2
- package/lib/character/idle-contact.js.map +1 -1
- package/lib/character/persona-templates.d.ts +23 -0
- package/lib/character/persona-templates.d.ts.map +1 -0
- package/lib/character/persona-templates.js +33 -0
- package/lib/character/persona-templates.js.map +1 -0
- package/lib/character/role-reference-data.d.ts.map +1 -0
- package/lib/character/role-reference-data.js.map +1 -0
- package/lib/character/sleep-service.d.ts +10 -1
- package/lib/character/sleep-service.d.ts.map +1 -1
- package/lib/character/sleep-service.js +156 -75
- package/lib/character/sleep-service.js.map +1 -1
- package/lib/character/sleep.d.ts +25 -3
- package/lib/character/sleep.d.ts.map +1 -1
- package/lib/character/sleep.js +15 -6
- package/lib/character/sleep.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +3436 -3298
- package/lib/client.js.map +4 -4
- package/lib/collaboration/tool-discovery.d.ts +1 -1
- package/lib/collaboration/tool-discovery.d.ts.map +1 -1
- package/lib/collaboration/tool-discovery.js +4 -3
- 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 +9 -7
- package/lib/companions/identity-tool.js.map +1 -1
- package/lib/companions/management-tool.d.ts +1 -1
- package/lib/companions/management-tool.d.ts.map +1 -1
- package/lib/companions/management-tool.js +3 -2
- package/lib/companions/management-tool.js.map +1 -1
- package/lib/companions/management.d.ts +28 -1
- package/lib/companions/management.d.ts.map +1 -1
- package/lib/companions/management.js +3 -2
- package/lib/companions/management.js.map +1 -1
- package/lib/execution/tool-access-adapter.d.ts +3 -0
- package/lib/execution/tool-access-adapter.d.ts.map +1 -1
- package/lib/execution/tool-access-adapter.js.map +1 -1
- package/lib/index.js +2 -3
- package/lib/index.js.map +1 -1
- package/lib/ui/channels-panel.d.ts.map +1 -1
- package/lib/ui/channels-panel.js +2 -1
- package/lib/ui/channels-panel.js.map +1 -1
- package/lib/ui/character-editor.d.ts +1 -1
- package/lib/ui/character-editor.d.ts.map +1 -1
- package/lib/ui/character-editor.js +2 -3
- package/lib/ui/character-editor.js.map +1 -1
- package/lib/ui/companion-deletion.js +1 -1
- package/lib/ui/companion-deletion.js.map +1 -1
- package/lib/ui/companion-vitals.d.ts +6 -0
- package/lib/ui/companion-vitals.d.ts.map +1 -0
- package/lib/ui/companion-vitals.js +44 -0
- package/lib/ui/companion-vitals.js.map +1 -0
- package/lib/ui/identity-editor.d.ts.map +1 -1
- package/lib/ui/identity-editor.js +2 -1
- package/lib/ui/identity-editor.js.map +1 -1
- package/lib/ui/persona-template.d.ts +5 -0
- package/lib/ui/persona-template.d.ts.map +1 -0
- package/lib/ui/persona-template.js +7 -0
- package/lib/ui/persona-template.js.map +1 -0
- package/lib/ui/push-draft.d.ts +4 -4
- package/lib/ui/qq-channel-settings.d.ts.map +1 -1
- package/lib/ui/qq-channel-settings.js +2 -1
- package/lib/ui/qq-channel-settings.js.map +1 -1
- package/lib/ui/qq-connection-guide.d.ts +2 -0
- package/lib/ui/qq-connection-guide.d.ts.map +1 -0
- package/lib/ui/qq-connection-guide.js +5 -0
- package/lib/ui/qq-connection-guide.js.map +1 -0
- package/lib/ui/role-reference.d.ts.map +1 -1
- package/lib/ui/role-reference.js +3 -2
- package/lib/ui/role-reference.js.map +1 -1
- package/lib/ui/sleep-editor.d.ts.map +1 -1
- package/lib/ui/sleep-editor.js +15 -5
- package/lib/ui/sleep-editor.js.map +1 -1
- package/package.json +8 -2
- package/lib/ui/role-reference-data.d.ts.map +0 -1
- package/lib/ui/role-reference-data.js.map +0 -1
- /package/lib/{ui → character}/role-reference-data.d.ts +0 -0
- /package/lib/{ui → character}/role-reference-data.js +0 -0
|
@@ -329,7 +329,7 @@ SOFTWARE.
|
|
|
329
329
|
|
|
330
330
|
## qq-bridge 聊天预设设计
|
|
331
331
|
|
|
332
|
-
角色 / 聊天行为分层和部分表达约束参考 Derpyu520/qq-bridge,提交 `a49877f4e58d04e47532d44b803360d0f001160d`。`src/
|
|
332
|
+
角色 / 聊天行为分层和部分表达约束参考 Derpyu520/qq-bridge,提交 `a49877f4e58d04e47532d44b803360d0f001160d`。`src/character/role-reference-data.ts` 收录该版本 `roles/小鲸鱼.md` 原文。页面只读预览与人格创作工具按需读取同一份参考;不作为当前人格自动注入日常聊天。未引入其 QQ / SnowLuma 代码或依赖,也未复制第三方 QQ 收藏图片。
|
|
333
333
|
|
|
334
334
|
MIT License
|
|
335
335
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# 2.21.11
|
|
2
|
+
|
|
3
|
+
- QQ 接入说明移除部署环境专属的 appnet 地址示例。
|
|
4
|
+
- 支持 SnowLuma 语音生成返回的 multimedia.nt.qq.com.cn 精确域名;保留其他地址校验。区分发送前合成失败与发送结果未知,避免把私聊错误描述为不支持语音。
|
|
5
|
+
- QQ 工具入口明确当前私聊、群聊均可使用文字转语音。
|
|
6
|
+
- 每轮人格提醒跳过纯 Markdown 标题,携带实际角色内容。
|
|
7
|
+
- 闲时活动附带最近三次已确认的结束记录,引导重新考虑当前兴趣与可用能力,避免把上轮等待或失败机械沿用为本轮结论;仍可安静休息,不强制发消息或对外操作。
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# 2.21.6
|
|
2
|
+
|
|
3
|
+
- 修复连续自主活动首轮误提示“QQ 账号未归属”:准备上下文时纳入宿主本轮接收、尚未提交到历史的消息,身份关系、好感度和权限提示使用同一份消息来源。消息拒绝、取消、替换以及同轮追加输入都会重新核验,不更改原始历史。
|
|
4
|
+
- 实际工具执行仍只依据已提交的消息和实时配置校验权限,不因上下文准备提前获得权限。自主活动与交流对象的关系绑定分别说明,群内自主活动不会冒用某个成员的关系。
|
|
5
|
+
- 移除插件内置的任务回复篇幅豁免和固定语气模板。语气、篇幅及相处方式由当前人格、适用关系、聊天偏好及本轮要求决定;保留投递协议、可见回复和工具权限约束。
|
|
6
|
+
- 不修改已保存的人格文本或聊天历史,不新增模型请求。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# 2.21.7
|
|
2
|
+
|
|
3
|
+
- 人格创作的 inspect 现在直接返回 qq-bridge 默认大肥鱼(原名“小鲸鱼”)完整参考、固定来源版本与改写指导。自己的身份工具、伙伴管理与页面弹窗共用一份资料;参考只在创作读取时返回,不作为当前人格注入日常聊天,不替换用户已有角色或关系。
|
|
4
|
+
- 修复长期不入睡:移除“一次模型判断后同一空闲不再检查”的门槛,按疲惫值每分钟本地抽样;后台记忆整理与观察归档不阻挡睡眠,实际对话、待办执行与会话准备仍阻挡自动入睡。
|
|
5
|
+
- 新增每伙伴独立的疲惫值(0–100):初始 30,清醒每小时约增加 5,实际睡眠每小时约恢复 15;重启、自然醒、短暂小睡及提前叫醒均保留剩余疲惫。界面展示紧凑的疲惫条。
|
|
6
|
+
- 自动入睡需要真实消息后空闲至少 3 分钟,疲惫达到 40 后每分钟按递增概率判断(1%–30%),醒来后至少 10 分钟不会再次自动入睡。自主活动不会反复重置真实消息的空闲计时;不新增睡眠判断模型请求。
|
|
7
|
+
- 私聊在睡眠中按人格给迷糊回应,按疲惫程度需要 1–4 次呼唤逐步醒来;10 秒内连发只计一次,10 分钟未继续则重新累计。紧急或明确立即唤醒请求、页面叫醒可以直接醒来,疲惫不清零。普通群消息不累计私聊唤醒次数。权限规则保持不变。
|
|
8
|
+
- 梦可缺席、分段及中断:入睡后延迟 5–15 分钟开始,每段完成后可能间隔 10–20 分钟继续,每次睡眠最多 4 段。被接收的消息打断正在生成的梦;未完成、截断、过期或取消的输出不保存,完成段保留。仍在睡眠时可以稍后接续;重启不重放未完成内容。
|
|
9
|
+
- 梦只读取当前会话范围内已有记忆,作为独立的想象与感受保存,不改写事实记忆,不清空聊天上下文。记忆关闭或没有可用记忆时可以睡眠而不做梦。
|
|
10
|
+
|
|
11
|
+
验证:睡眠/疲惫/中断并发回归、真实宿主 pre-step 上下文时序、人格参考与权限隔离;手机/桌面、浅色/深色疲惫条与叫醒交互。
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# 2.21.8
|
|
2
|
+
|
|
3
|
+
- 总览顶部显示好感度(分数、等级)与疲惫值(分数、清醒/睡眠状态),无需进入身份页。关闭功能时显示“已暂停”并保留数值。仅在总览打开且页面可见时刷新,单项请求失败保留上次读数并支持重试。
|
|
4
|
+
- 删除伙伴入口补齐字体、间距、边框、危险色及键盘焦点样式;确认删除使用统一的确认弹窗,保留原删除条件与保护。
|
|
5
|
+
- 基本身份、角色设定、关系设定分别提供共用的字段映射与通用参考模板,页面可展开查看,AI 可通过现有身份工具 reference 动作或 inspect includeReferences=true 按需取得。
|
|
6
|
+
- 人格创建请求或明确询问模板/大肥鱼参考时,在有身份编辑权限的当前用户轮次直接提供三份模板与 qq-bridge 完整原卡,明确与 dsh-cosplay 区分。普通身份读取、日常修改、闲时自主活动不自动附加参考;AI 自主优化不要求重新套版。
|
|
7
|
+
- 引用模板不自动改写当前人物、关系或工具权限,不增加常驻工具。伙伴管理 inspect 同样支持 includeReferences。
|
|
8
|
+
|
|
9
|
+
验证:人格入口、权限与真实 pre-step 时序回归;总览刷新、部分失败、暂停状态、删除取消、三份模板展示,以及手机/桌面、浅色/深色浏览器检查。
|
package/lib/agent-runtime.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import type { SleepService } from './character/sleep-service.js';
|
|
1
2
|
import type { ScheduledPartnerTask } from './scheduler/domain.js';
|
|
2
3
|
import type { Context } from '@deepseek-ai/cordis';
|
|
3
4
|
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
4
5
|
import type { AgentDefaultModelConfig } from '@deepseek-ai/dsh-agent-default-model';
|
|
5
6
|
import type { AgentPresetRegistry as AgentPresets } from '@deepseek-ai/dsh-agent-preset-registry';
|
|
7
|
+
import type { UserMessage } from '@deepseek-ai/dsh-llm';
|
|
6
8
|
import type { SessionId } from '@deepseek-ai/dsh-session';
|
|
7
9
|
import type { Session, SessionEvent } from '@deepseek-ai/dsh-session';
|
|
8
10
|
import type { WorkspaceRegistry } from '@deepseek-ai/dsh-workspace';
|
|
@@ -103,6 +105,8 @@ export declare class PartnerAgentRuntime {
|
|
|
103
105
|
private closed;
|
|
104
106
|
private questionAnswerer;
|
|
105
107
|
constructor(ctx: RuntimeContext, store: PartnerStore, defaultCwd: string, memory?: PartnerMemoryStore | undefined, reflection?: MemoryReflectionService | undefined, concerns?: PartnerConcernStore | undefined, composer?: PartnerAgentComposer | undefined);
|
|
108
|
+
private sleepService;
|
|
109
|
+
setSleepService(service: SleepService): void;
|
|
106
110
|
setQuestionAnswerer(answerer: PartnerQuestionAnswerer): void;
|
|
107
111
|
/** Cancel pending/claimed continuations as soon as another real input is admitted. */
|
|
108
112
|
cancelPostReply(companionId: string, keepUserMessageId?: string): Promise<void>;
|
|
@@ -162,11 +166,14 @@ export declare class PartnerAgentRuntime {
|
|
|
162
166
|
removeCompanionDirectory(companionId: string): Promise<void>;
|
|
163
167
|
reloadCompanion(companionId: string): Promise<void>;
|
|
164
168
|
/** Awaited by the host before prompt/tool assembly, never from a running tool. */
|
|
165
|
-
prepareAgentTurn(agent: Agent, turn: number, signal: AbortSignal): Promise<void>;
|
|
169
|
+
prepareAgentTurn(agent: Agent, turn: number, signal: AbortSignal, messages?: readonly UserMessage[]): Promise<void>;
|
|
166
170
|
/** Also used by assembly: never return a model-facing snapshot before setup. */
|
|
167
171
|
prepareAgentAssembly(agent: Agent, signal: AbortSignal): Promise<boolean>;
|
|
168
172
|
private readonly replyPresentations;
|
|
169
173
|
private readonly contextRevisions;
|
|
174
|
+
private readonly admittedInputs;
|
|
175
|
+
/** Projection only: the host commits admitted input after prompt preparation. */
|
|
176
|
+
private inputEvents;
|
|
170
177
|
private prepareConversationContext;
|
|
171
178
|
/** Catch up visible legacy/interrupted turns before the final review; retries use stable IDs. */
|
|
172
179
|
prepareRenewalMemory(companionId: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"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"}
|
package/lib/agent-runtime.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { personaReferenceRequested, renderPersonaReference } from './character/identity-guide.js';
|
|
1
2
|
import { activityPolicyCurrent, postReplyAllowed, postReplyCurrent, postReplyProbability, POST_REPLY_PROMPT } from './character/post-reply.js';
|
|
2
3
|
import { PARTNER_TOOL_ENTRIES } from './collaboration/tool-discovery.js';
|
|
3
4
|
import { setReplyTiming } from './channels/qq/latency.js';
|
|
@@ -7,6 +8,7 @@ import { affectionEnabled, awardAffection, renderAffection } from './character/a
|
|
|
7
8
|
import { affectionTurnEligible, currentAffectionAudience } from './character/affection-context.js';
|
|
8
9
|
import { currentQqIdentityRelation, renderQqIdentityRelation } from './channels/qq/identity-binding.js';
|
|
9
10
|
import { qqSettings, qqSessionTarget } from './channels/qq/settings.js';
|
|
11
|
+
import { fatigueValue } from './character/fatigue.js';
|
|
10
12
|
import { renderSleepContext, isSleeping } from './character/sleep.js';
|
|
11
13
|
import { questionOrigin } from './channels/question-origin.js';
|
|
12
14
|
import { renderCharacterContext } from './character/domain.js';
|
|
@@ -113,7 +115,7 @@ export class PartnerAgentRuntime {
|
|
|
113
115
|
const configuration = this.configurations.forSession(context.agent.session.id);
|
|
114
116
|
if (configuration?.companion.toolDiscovery)
|
|
115
117
|
return { ...assembly, tools: assembly.tools.filter(tool => PARTNER_TOOL_ENTRIES.some(name => name === tool.name)) };
|
|
116
|
-
const access = resolveToolAccess({ agent: context.agent, state: this.store.snapshot() });
|
|
118
|
+
const access = resolveToolAccess({ agent: context.agent, state: this.store.snapshot(), ...(this.admittedInputs.get(context.agent)?.length ? { events: this.inputEvents(context.agent) } : {}) });
|
|
117
119
|
return { ...assembly, tools: !access.sendTools ? [] : access.allowedTools ? assembly.tools.filter(tool => access.allowedTools.includes(tool.name)) : assembly.tools };
|
|
118
120
|
};
|
|
119
121
|
if (this.rebuildingAssemblies.has(context))
|
|
@@ -131,15 +133,33 @@ export class PartnerAgentRuntime {
|
|
|
131
133
|
}
|
|
132
134
|
}) : () => { };
|
|
133
135
|
this.disposeConfigurationListener = typeof this.ctx.on === 'function'
|
|
134
|
-
? this.ctx.on('agent/pre-step', async ({ agent, turn, signal }, next) => {
|
|
135
|
-
|
|
136
|
-
|
|
136
|
+
? this.ctx.on('agent/pre-step', async ({ agent, turn, signal, messages }, next) => {
|
|
137
|
+
try {
|
|
138
|
+
await this.prepareAgentTurn(agent, turn, signal, messages);
|
|
139
|
+
const decision = await next();
|
|
140
|
+
if (decision.kind === 'reject') {
|
|
141
|
+
this.admittedInputs.delete(agent);
|
|
142
|
+
this.contextRevisions.delete(agent);
|
|
143
|
+
}
|
|
144
|
+
else if (decision.kind === 'enter') {
|
|
145
|
+
this.admittedInputs.set(agent, decision.messages);
|
|
146
|
+
await this.sleepService?.acceptInput(agent.session.id, decision.messages);
|
|
147
|
+
await this.prepareConversationContext(agent, signal);
|
|
148
|
+
}
|
|
149
|
+
return decision;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.admittedInputs.delete(agent);
|
|
153
|
+
this.contextRevisions.delete(agent);
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
137
156
|
}) : () => { };
|
|
138
157
|
this.disposeAgentListener = typeof this.ctx.on === 'function'
|
|
139
158
|
? this.ctx.on('agent/disposed', ({ agent }) => {
|
|
140
159
|
this.replyPresentations.get(agent)?.();
|
|
141
160
|
this.replyPresentations.delete(agent);
|
|
142
161
|
this.preparedTurns.delete(agent);
|
|
162
|
+
this.admittedInputs.delete(agent);
|
|
143
163
|
this.characterContexts.get(agent.session.id)?.();
|
|
144
164
|
this.characterContexts.delete(agent.session.id);
|
|
145
165
|
this.contextRevisions.delete(agent);
|
|
@@ -151,6 +171,8 @@ export class PartnerAgentRuntime {
|
|
|
151
171
|
})
|
|
152
172
|
: () => { };
|
|
153
173
|
}
|
|
174
|
+
sleepService;
|
|
175
|
+
setSleepService(service) { this.sleepService = service; }
|
|
154
176
|
setQuestionAnswerer(answerer) {
|
|
155
177
|
this.questionAnswerer = answerer;
|
|
156
178
|
}
|
|
@@ -241,7 +263,7 @@ export class PartnerAgentRuntime {
|
|
|
241
263
|
else if (!idleContactDue(this.store.snapshot(), companion, user, Date.now(), timeZone))
|
|
242
264
|
return;
|
|
243
265
|
const stableSeq = agent.session.seq;
|
|
244
|
-
const message = createUserMessage({ content: [{ type: 'text', text: idleActivityPrompt(this.store.snapshot(), companion) + (continuation ? '\n' + POST_REPLY_PROMPT : '')
|
|
266
|
+
const message = createUserMessage({ content: [{ type: 'text', text: idleActivityPrompt(this.store.snapshot(), companion, agent.session.snapshotEvents()) + (continuation ? '\n' + POST_REPLY_PROMPT : '')
|
|
245
267
|
}], source: { kind: 'plugin:@lemoncat7/dsh-partner', plugin: '@lemoncat7/dsh-partner', form: 'notice', summary: IDLE_CONTACT_NOTICE } });
|
|
246
268
|
let claimed = false;
|
|
247
269
|
await this.store.update(draft => {
|
|
@@ -714,6 +736,11 @@ export class PartnerAgentRuntime {
|
|
|
714
736
|
}
|
|
715
737
|
}
|
|
716
738
|
async observeSessionEvent(session, event) {
|
|
739
|
+
if (event.type === 'turn/end') {
|
|
740
|
+
const agent = this.ctx?.agents?.get(session.id);
|
|
741
|
+
if (agent)
|
|
742
|
+
this.admittedInputs?.delete(agent);
|
|
743
|
+
}
|
|
717
744
|
if (event.type === 'user/message' && event.data.source.kind === 'user') {
|
|
718
745
|
const owner = this.store.snapshot().sessions.find(r => r.sessionId === session.id)?.companionId;
|
|
719
746
|
if (owner) {
|
|
@@ -883,12 +910,12 @@ export class PartnerAgentRuntime {
|
|
|
883
910
|
throw new Error('伙伴不存在');
|
|
884
911
|
}
|
|
885
912
|
/** Awaited by the host before prompt/tool assembly, never from a running tool. */
|
|
886
|
-
async prepareAgentTurn(agent, turn, signal) {
|
|
913
|
+
async prepareAgentTurn(agent, turn, signal, messages = []) {
|
|
887
914
|
if (this.closed)
|
|
888
915
|
throw new Error('伙伴运行时已关闭');
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
916
|
+
this.admittedInputs.set(agent, messages);
|
|
917
|
+
if (this.preparedTurns.get(agent) !== turn)
|
|
918
|
+
await this.prepareAgentAssembly(agent, signal);
|
|
892
919
|
await this.prepareConversationContext(agent, signal);
|
|
893
920
|
this.preparedTurns.set(agent, turn);
|
|
894
921
|
}
|
|
@@ -908,7 +935,7 @@ export class PartnerAgentRuntime {
|
|
|
908
935
|
if (this.store.isCompanionRemoving(configuration.companion.id))
|
|
909
936
|
throw new Error('伙伴正在删除,不能启动新轮次');
|
|
910
937
|
signal.throwIfAborted();
|
|
911
|
-
const access = resolveToolAccess({ agent, state: this.store.snapshot() });
|
|
938
|
+
const access = resolveToolAccess({ agent, state: this.store.snapshot(), ...(this.admittedInputs.get(agent)?.length ? { events: this.inputEvents(agent) } : {}) });
|
|
912
939
|
let presentationChanged = false;
|
|
913
940
|
const stableNative = configuration.companion.toolDiscovery || !!access.allowedTools;
|
|
914
941
|
if (stableNative && !this.replyPresentations.has(agent) && typeof agent.ctx.tools?.presentAs === 'function') {
|
|
@@ -942,6 +969,18 @@ export class PartnerAgentRuntime {
|
|
|
942
969
|
}
|
|
943
970
|
replyPresentations = new Map();
|
|
944
971
|
contextRevisions = new WeakMap();
|
|
972
|
+
admittedInputs = new WeakMap();
|
|
973
|
+
/** Projection only: the host commits admitted input after prompt preparation. */
|
|
974
|
+
inputEvents(agent) {
|
|
975
|
+
const events = agent.session.snapshotEvents();
|
|
976
|
+
const pending = this.admittedInputs?.get(agent) ?? [];
|
|
977
|
+
if (!pending.length)
|
|
978
|
+
return events;
|
|
979
|
+
const committed = new Set(events.flatMap(e => e.type === 'user/message' ? [e.data.id] : []));
|
|
980
|
+
return [...events, ...pending.filter(m => !committed.has(m.id)).map((data, index) => ({
|
|
981
|
+
type: 'user/message', data, seq: (agent.session.seq + index + 1), time: Date.now(), surfaceOp: 'append',
|
|
982
|
+
}))];
|
|
983
|
+
}
|
|
945
984
|
async prepareConversationContext(agent, signal) {
|
|
946
985
|
const config = this.configurations.forSession(agent.session.id);
|
|
947
986
|
if (!config)
|
|
@@ -949,22 +988,25 @@ export class PartnerAgentRuntime {
|
|
|
949
988
|
const { companion, route } = config;
|
|
950
989
|
const state = this.store.snapshot();
|
|
951
990
|
const relationEvents = state.channels?.some(c => c.platform === 'qq' && state.sessions.some(r => r.sessionId === agent.session.id && r.channelId === c.id))
|
|
952
|
-
?
|
|
991
|
+
? this.inputEvents(agent) : undefined;
|
|
953
992
|
const identityRelation = relationEvents ? currentQqIdentityRelation(agent.session.id, relationEvents, state.sessions, state.channels) : undefined;
|
|
954
|
-
|
|
993
|
+
const committedMessages = agent.session.deriveMessages?.() ?? [];
|
|
994
|
+
const committedIds = new Set(committedMessages.map(m => m.id));
|
|
995
|
+
const messages = [...committedMessages, ...(this.admittedInputs?.get(agent) ?? []).filter(m => !committedIds.has(m.id))];
|
|
996
|
+
const last = [...messages].reverse().find(m => m.role === 'user' && m.source.kind === 'user');
|
|
997
|
+
const query = last && last.role === 'user' ? textContent(last.content) : '';
|
|
998
|
+
if (!identityRelation && !relationshipTextForIdentity(companion) && (!this.memory || !companion.automation.memory.enabled) && !companion.characterCard?.enabled && !renderSleepContext(companion, route.id) && !personaReferenceRequested(query)) {
|
|
955
999
|
this.characterContexts.get(agent.session.id)?.();
|
|
956
1000
|
this.characterContexts.delete(agent.session.id);
|
|
957
1001
|
this.contextRevisions.delete(agent);
|
|
958
1002
|
return false;
|
|
959
1003
|
}
|
|
960
|
-
const
|
|
961
|
-
const last = [...messages].reverse().find(m => m.role === 'user' && m.source.kind === 'user');
|
|
962
|
-
const query = last && last.role === 'user' ? textContent(last.content) : '';
|
|
963
|
-
const events = relationEvents ?? agent.session.snapshotEvents();
|
|
1004
|
+
const events = relationEvents ?? this.inputEvents(agent);
|
|
964
1005
|
const origin = [...events].reverse().find(e => e.type === 'user/message' && (e.data.source.kind === 'user' || isIdleContactNotice(e) || isInternalTaskNotice(e)));
|
|
965
1006
|
const autonomous = Boolean(origin && isIdleContactNotice(origin));
|
|
966
1007
|
const affectionAudience = currentAffectionAudience(state, companion.id, agent.session.id, events);
|
|
967
|
-
const
|
|
1008
|
+
const access = resolveToolAccess({ agent, state, events });
|
|
1009
|
+
const revision = `${JSON.stringify(access)}:${JSON.stringify(identityRelation)}:${config.revision}:${last?.id ?? ''}:${autonomous && origin?.type === 'user/message' ? origin.data.id : ''}:${JSON.stringify([companion.sleepState?.episode, companion.sleepState?.reception, Math.round(fatigueValue(companion))])}:${companion.sleepState?.dreams?.at(-1)?.id ?? ''}:${affectionAudience}:${companion.affection?.updatedAt ?? 0}`;
|
|
968
1010
|
if (this.contextRevisions.get(agent) === revision)
|
|
969
1011
|
return false;
|
|
970
1012
|
const scope = conversationMemoryScope(route, this.store.snapshot().sessions);
|
|
@@ -979,16 +1021,15 @@ export class PartnerAgentRuntime {
|
|
|
979
1021
|
}
|
|
980
1022
|
signal.throwIfAborted();
|
|
981
1023
|
const relationshipAllowed = !identityRelation || identityRelation.matched;
|
|
982
|
-
const
|
|
983
|
-
const text = [access.allowedTools || !access.sendTools ? access.denialReason + ' 回复能力通过 partner_tools 查询和调用(未开启统一入口时使用原工具);语音能力为 partner_qq_reply;不能代办操作,不承诺使用私有能力。' : '',
|
|
1024
|
+
const text = [origin?.type === 'user/message' && origin.data.source.kind === 'user' && access.sendTools && (!access.allowedTools || access.allowedTools.includes('partner_identity')) && personaReferenceRequested(query) ? renderPersonaReference() : '', access.allowedTools || !access.sendTools ? access.denialReason + ' 回复能力通过 partner_tools 查询和调用(未开启统一入口时使用原工具);语音能力为 partner_qq_reply;不能代办操作,不承诺使用私有能力。' : '',
|
|
984
1025
|
renderIdentityRelationship(companion, identityRelation ? { channel: 'qq', matched: identityRelation.matched } : { channel: 'default' }),
|
|
985
1026
|
renderAffection(companion, affectionAudience),
|
|
986
1027
|
renderCharacterContext(companion.characterCard, messages.slice(-6).filter(m => m.role === 'user' || m.role === 'assistant').map(m => textContent(m.content)).join('\n').slice(-12000), relationshipAllowed ? story : undefined),
|
|
987
1028
|
recalled ? renderMemory(recalled.relevant, recalled.connections, recalled.scenes, recalled.history) : '',
|
|
988
1029
|
recalled && relationshipAllowed ? renderProfile(recalled.profile) : '',
|
|
989
1030
|
renderConversationTurn(companion.characterCard, consecutiveUserMessages, autonomous),
|
|
990
|
-
renderQqIdentityRelation(identityRelation),
|
|
991
|
-
renderSleepContext(companion, this.store.snapshot().sessions.filter(r => r.companionId === companion.id && r.sessionId === route.sessionId).map(r => r.id)),
|
|
1031
|
+
renderQqIdentityRelation(identityRelation, autonomous && access.sendTools && !access.allowedTools),
|
|
1032
|
+
renderSleepContext(companion, this.store.snapshot().sessions.filter(r => r.companionId === companion.id && r.sessionId === route.sessionId).map(r => r.id), autonomous ? undefined : last?.id),
|
|
992
1033
|
].filter(Boolean).join('\n\n');
|
|
993
1034
|
this.characterContexts.get(agent.session.id)?.();
|
|
994
1035
|
// A changing .section() appends an entire system prompt on in-history routes.
|