@rezti/dsh-rez-task-handoff 0.1.0-beta.2 → 0.1.0-beta.4

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 CHANGED
@@ -1,15 +1,15 @@
1
- # Jarvis 跨会话任务交接(模拟版 0.1.0-beta.2)
1
+ # Jarvis 跨会话任务交接(模拟版 0.1.0-beta.4)
2
2
 
3
3
  适用目标:DeepSeek Harness 桌面版,宿主 0.2.1-rc.5,Aurabot 1.1.24,desktop profile。只接受成功、失败、超时、需要确认四种模拟任务。没有 HA、摄像头、真实设备、系统命令或任意任务执行入口。不依赖或改动 RezSuite。
4
4
 
5
5
  ## 从 npm 下载并检查
6
6
 
7
- 这是通过 npm 分发的 **Aurabot 用户模块**。以下命令下载已发布的 beta.1。测试 beta.2 本地包时,把对应的压缩包解压到临时目录即可。
7
+ 这是通过 npm 分发的 **Aurabot 用户模块**。先下载并解包,再核对目标机。
8
8
 
9
9
  ```bash
10
10
  cd "$(mktemp -d)"
11
- npm pack @rezti/dsh-rez-task-handoff@0.1.0-beta.1 --ignore-scripts --registry https://registry.npmjs.org
12
- tar -xzf rezti-dsh-rez-task-handoff-0.1.0-beta.1.tgz
11
+ npm pack @rezti/dsh-rez-task-handoff@0.1.0-beta.4 --ignore-scripts --registry https://registry.npmjs.org
12
+ tar -xzf rezti-dsh-rez-task-handoff-0.1.0-beta.4.tgz
13
13
  node package/inspect.mjs
14
14
  ```
15
15
 
@@ -17,8 +17,8 @@ node package/inspect.mjs
17
17
 
18
18
  ## 接口与取舍
19
19
 
20
- - [Aurabot 1.1.24 用户模块 API](https://github.com/aureth-labs/dsh-aurabot-qq/blob/v1.1.24/src/modules/API.md):使用 API v1 的 `tool`、`defineTool`、`prompt`、`rule`、`settings`、`isOwner`、`dataDir`、`every` 和卸载回调。用户模块目录与插件安装目录分离,升级保留;本扩展检测到其他 Aurabot 版本会停用,待核对再放开。
21
- - 从 1.1.24 源码验证,Aurabot 在 QQ agent 的 `agent.ctx.tools` 上挂模块工具。“纯聊天”档不挂模块工具,需要已有的支持工具档位。本模块同时核对配置的主人、原私聊 ID、实际执行会话和最新入站消息的可信标记。主人私聊的普通消息可查状态,提交须明确发送「让 Jarvis 做交接测试 success」或指定其他模拟模式。群聊、其他私聊、后台轮、DSH 直接输入、回传轮都不能触发。
20
+ - [Aurabot 1.1.24 用户模块 API](https://github.com/aureth-labs/dsh-aurabot-qq/blob/v1.1.24/src/modules/API.md) 提供 `tool`、`defineTool`、`prompt`、`rule`、`settings`、`config`、`isOwner`、`dataDir`、`every` 和卸载回调。用户模块目录与插件安装目录分离,升级保留。本扩展检测到其他 Aurabot 版本会停用,待核对再放开。
21
+ - 从 1.1.24 源码验证,Aurabot 在 QQ agent 的 `agent.ctx.tools` 上挂模块工具。“纯聊天”档不挂模块工具,需要已有的支持工具档位。本模块同时核对配置的主人、原私聊 ID、实际执行会话和最新入站消息的可信标记。核对来源时跳过 DSH 的运行时上下文和 rc.5 的时间快照,以免把它们当成新的用户输入。主人私聊的普通消息可查状态,提交须明确发送「让 Jarvis 做交接测试 success」或指定其他模拟模式。群聊、其他私聊、后台轮、DSH 直接输入、回传轮都不能触发。
22
22
  - DSH 0.2.1-rc.5 发行包已验证 `agents.get`、`Agent.followup`、`session/event`、`ToolRuntime.restrict/guard` 与 `exec.concludeTurn()`。用固定的完整会话 ID 定位已打开的 Jarvis。用唯一输入消息 ID 关联 `user/message` 与对应 `turn/end`,且只有模拟工具的结果可成为任务结果。`whenIdle()` 只用于清理;它不是具体任务的完成回执。测试运行时实际装载了同版本 AgentLoop。
23
23
  - 回传使用原 QQ Agent 的原生 follow-up。Aurabot 的聊天中枢会监听原会话事件并发送普通回复。以 `hub.sessions()`、`chatOfSession()` 做最后校验,映射变更、Agent 不在、主人静音时先等;通知最多等待十分钟。本机发布代码与真实核心的隔离测试证明这条路径成立。Aurabot 的 hub 映射和自动转发是版本相关的实现,未宣称跨版本稳定。没有采用 `api.think`:它会走后台会话。
24
24
  - [dsh-peer-bus](https://github.com/ybh1291747665/dsh-peer-bus) 和 [dsh-cross-session-agent](https://github.com/dd2673/dsh-cross-session-agent) 有成熟的会话间寻址、投递思路,但不能直接提供这里要求的 Aurabot 主人私聊作用域、模拟业务结果与原 QQ 回传闭环。这里复用原生 follow-up,不另造通信协议或引入跨进程桥。
@@ -37,10 +37,10 @@ node package/inspect.mjs
37
37
 
38
38
  1. 在目标机运行只读脚本;确认运行中的 desktop 宿主、Aurabot 已激活、主人 QQ 私聊支持模块工具。检查是否已有专用 Jarvis 测试会话和准确 ID。若主人使用“纯聊天”档,先停在这里:不升级现有权限。可在另一步加入受信的显式主人私聊命令入口。
39
39
  2. 确认扩展面板显示的用户模块目录。默认是 `~/.dsh/plugins-data/aurabot/modules/`,以面板实际目录为准。检查没有同名模块。把解包所得的 `package/module/` 复制到用户模块目录,命名为 `rez-task-handoff`,确保其中直接包含 `index.mjs` 和 `ledger.mjs`。此动作会触发 Aurabot 热加载;通常无需重启。模块设置默认未启用。请在 Aurabot 的扩展面板确认模块加载,不使用 DSH 的 `plugin add`。
40
- 3. 在 Aurabot 扩展面板输入自己指定的主人 QQ 与 Jarvis 完整会话 ID,先只勾选模拟交接。保持目标会话可用。启用后,提交模拟任务将调用配置中的模型,可能产生普通模型用量;自动回传开关仍关闭。真实 QQ 测试经用户确认后才开启回传,继续遵守 Aurabot 的总开关和试运行。
40
+ 3. 在 Aurabot 扩展面板填写 Jarvis 完整会话 ID,先只勾选模拟交接。扩展沿用大肥鱼的主人 QQ 设置,升级前保留的同名扩展字段会被忽略。保持目标会话可用。启用后,提交模拟任务将调用配置中的模型,可能产生普通模型用量。开启自动回传后才能在 QQ 收到主动通知。
41
41
  4. 回滚:先关闭模块内启用与回传开关,等待测试轮结束,再从扩展面板停用模块,并将 `modules/rez-task-handoff/` 移出扫描目录。只影响这个模块,不覆盖大肥鱼、RezSuite 或桌面应用。账本位于 Aurabot 数据目录下的 `modules-data/rez-task-handoff/tasks.json`,可备份留查;卸载不删除它。已提交到 DSH 或网关的消息不能从模块撤回。
42
42
 
43
- 从 beta.1 升级时,等当前测试和回传结束,停用扩展并将旧目录移出扫描目录,再按相同的模块目录名放入新版并启用。账本格式兼容。需要回滚时,按同样方法换回旧目录。查询支持完整任务编号或显示的 8 位短编号,发生短编号冲突时需提供完整编号。
43
+ 升级时,等当前测试和回传结束,停用扩展并将旧目录移出扫描目录,再按相同的模块目录名放入新版并启用。账本格式兼容。需要回滚时,按同样方法换回旧目录。查询支持完整任务编号或显示的 8 位短编号,发生短编号冲突时需提供完整编号。
44
44
 
45
45
  ## 测试与实机验收
46
46
 
@@ -50,7 +50,7 @@ node package/inspect.mjs
50
50
  node --test test/module.test.mjs
51
51
  ```
52
52
 
53
- 原生组合测试:将上游 **v1.1.24** 源码解包到临时目录;在另一临时目录安装 npm 上明确锁定的 `@deepseek-ai/dsh-agent-loop-testkit@0.2.1-rc.5`、`@deepseek-ai/dsh-agent-loop@0.2.1-rc.5`、`@deepseek-ai/dsh-tools@0.2.1-rc.5`。测试加载真实模块 API、真实 DSH AgentLoop 和真实 Aurabot hub,只替换模型和网关,在临时目录写模拟数据。
53
+ 原生组合测试:将上游 **v1.1.24** 源码解包到临时目录。在另一临时目录安装 npm 上明确锁定的 `@deepseek-ai/dsh-agent-loop-testkit@0.2.1-rc.5`、`@deepseek-ai/dsh-agent-loop@0.2.1-rc.5`、`@deepseek-ai/dsh-tools@0.2.1-rc.5` 和 `@deepseek-ai/dsh-time-context@0.2.1-rc.5`。测试加载真实模块 API、DSH AgentLoop、时间快照插件和 Aurabot hub,只替换模型和网关,在临时目录写模拟数据。
54
54
 
55
55
  ```bash
56
56
  HANDOFF_DSH_FIXTURE=/绝对路径/临时运行时 \
@@ -60,4 +60,6 @@ HANDOFF_REAL_DELAY=1 node --test test/native.test.mjs
60
60
 
61
61
  2026-11-04 beta.2 结果为 11 项单元测试、1 项原生组合测试通过。Aurabot 从临时用户模块目录加载扩展。两条各约 20 秒的任务(成功和失败)约 42 秒完成,等待期间原会话能继续聊天,后续输出各发送一次到模拟 OneBot。Jarvis 从 PTC 预设继承的工具呈现方式在任务结束后恢复。单元测试覆盖超时、确认、目标丢失、源会话更换、权限隔离、重复提交、模块重启恢复、短编号查询,以及含糊的重试不入队。beta.2 尚未在目标 Mac mini 和真实 QQ 上验证,也未模拟整机断电。Aurabot 面板自身的模拟会话没有真实主人私聊映射。
62
62
 
63
+ 2026-11-04 beta.4 回归测试使用 rc.5 的真实时间快照插件。beta.2 在同一条主人私聊消息后插入时间快照时,返回「交接只接受已授权的主人 QQ 私聊消息」。beta.4 包含 beta.3 的修复,并用 Aurabot 当前主人设置完成授权。测试验证主人私聊可以入队并从原会话回传,桌面输入无法借用前一条 QQ 消息的授权。更换主人时,旧账号的工具调用被拒绝,未开始的旧任务中断。
64
+
63
65
  实机顺序:主人私聊发送「让 Jarvis 做交接测试 success」→ 拿到编号 → 立即再聊一句 → 等结果;接着连续发两条(等各自收到编号,避免上游合并为一轮),再分别测 failure、timeout、confirmation。最后用同一任务 ID 查询状态,并验证非主人和群聊不会产生任务。断电/重启测试先把相关工作保存,确认测试实例处于安全状态后单独做。
package/module/index.mjs CHANGED
@@ -32,6 +32,7 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
32
32
  const agents = ctx?.get?.('agents')
33
33
  const registry = ctx?.get?.('tools')
34
34
  if (api.version !== VERSION || api.apiVersion !== 1 ||
35
+ typeof api.config !== 'function' || typeof api.isOwner !== 'function' ||
35
36
  typeof hub?.sessions !== 'function' || typeof hub?.chatOfSession !== 'function' ||
36
37
  typeof ctx?.on !== 'function' || typeof agents?.get !== 'function' ||
37
38
  typeof registry?.schemas !== 'function') {
@@ -48,7 +49,7 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
48
49
 
49
50
  function config() {
50
51
  const s = api.settings()
51
- const owner = String(s.ownerQQ ?? '').trim()
52
+ const owner = String(api.config()?.ownerQQ ?? '').trim()
52
53
  const target = String(s.jarvisSessionId ?? '').trim()
53
54
  if (disposed || broken || s.enabled !== true || !ownerPattern.test(owner) ||
54
55
  !idPattern.test(target) || !api.isOwner(owner)) return
@@ -98,8 +99,11 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
98
99
  const e = session.eventAt(seq)
99
100
  if (e?.type === 'turn/start' || e?.type === 'turn/end') break
100
101
  if (e?.type !== 'user/message') continue
101
- if (e.data?.source?.kind === 'runtime-context') continue
102
- if (e.data?.source?.kind !== 'aurabot') return
102
+ const source = e.data?.source
103
+ // DSH rc.5 inserts its clock snapshot after the real QQ message.
104
+ if (source?.kind === 'runtime-context' ||
105
+ (source?.kind === 'time-context' && source.form === 'snapshot')) continue
106
+ if (source?.kind !== 'aurabot') return
103
107
  for (const block of e.data.content ?? []) {
104
108
  if (block?.type !== 'text' || typeof block.text !== 'string' || !block.text.startsWith(STAMP)) continue
105
109
  const permit = permits.get(block.text)
@@ -251,7 +255,8 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
251
255
  name: MOCK,
252
256
  description: '执行当前交接的唯一无害模拟步骤。无须参数;不可执行系统或设备操作。',
253
257
  async execute(_args, exec) {
254
- if (disposed || broken || !config() || active !== run ||
258
+ const c = config()
259
+ if (!c || c.chatId !== task.sourceChatId || c.target !== run.target || active !== run ||
255
260
  exactId(exec?.agent) !== run.target || run.turn === undefined) {
256
261
  return { ok: false, message: '没有可执行的交接。' }
257
262
  }
@@ -441,12 +446,11 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
441
446
  export default {
442
447
  id: ID,
443
448
  name: 'Jarvis 跨会话交接(模拟)',
444
- version: '0.1.0-beta.2',
449
+ version: '0.1.0-beta.4',
445
450
  api: 1,
446
451
  description: '把主人私聊的模拟任务交给指定 Jarvis 会话并回传结果。',
447
452
  settings: [
448
453
  { key: 'enabled', label: '启用模拟交接', type: 'switch' },
449
- { key: 'ownerQQ', label: '主人 QQ 号(须与大肥鱼设置一致)', type: 'text' },
450
454
  { key: 'jarvisSessionId', label: 'Jarvis 会话 ID', type: 'text' },
451
455
  { key: 'notify', label: '允许回到原 QQ 会话主动通知', type: 'switch' },
452
456
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rezti/dsh-rez-task-handoff",
3
- "version": "0.1.0-beta.2",
3
+ "version": "0.1.0-beta.4",
4
4
  "description": "Aurabot user module for simulated cross-session Jarvis task handoffs in DeepSeek Harness.",
5
5
  "type": "module",
6
6
  "main": "./module/index.mjs",