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

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,4 +1,4 @@
1
- # Jarvis 跨会话任务交接(模拟版 0.1.0-beta.5)
1
+ # Jarvis 跨会话任务交接(模拟版 0.1.0)
2
2
 
3
3
  适用目标:DeepSeek Harness 桌面版,宿主 0.2.1-rc.5,Aurabot 1.1.24,desktop profile。只接受成功、失败、超时、需要确认四种模拟任务。没有 HA、摄像头、真实设备、系统命令或任意任务执行入口。不依赖或改动 RezSuite。
4
4
 
@@ -8,8 +8,8 @@
8
8
 
9
9
  ```bash
10
10
  cd "$(mktemp -d)"
11
- npm pack @rezti/dsh-rez-task-handoff@0.1.0-beta.5 --ignore-scripts --registry https://registry.npmjs.org
12
- tar -xzf rezti-dsh-rez-task-handoff-0.1.0-beta.5.tgz
11
+ npm pack @rezti/dsh-rez-task-handoff@0.1.0 --ignore-scripts --registry https://registry.npmjs.org
12
+ tar -xzf rezti-dsh-rez-task-handoff-0.1.0.tgz
13
13
  node package/inspect.mjs
14
14
  ```
15
15
 
@@ -64,4 +64,8 @@ HANDOFF_REAL_DELAY=1 node --test test/native.test.mjs
64
64
 
65
65
  beta.5 的组合测试在 Jarvis 会话直接注册额外的测试工具,复现了 beta.4 在入队后拒绝投递。更新后,发给 Jarvis 模型的工具列表只含模拟工具。即使模拟模型尝试调用隐藏的工具,执行守卫也会拒绝,测试工具没有被执行。轮次结束后原工具列表恢复,模拟结果按原任务编号回到原 QQ 会话。真实 QQ 和目标 Mac mini 待复测。
66
66
 
67
+ beta.6 将组合测试扩展到已有对话、且模型适配器保留历史工具声明的情况。beta.5 的临时过滤在这种情况下会被适配器的历史声明补回。新版为匹配的模拟请求单独建立工具声明,保留原会话消息。测试确认模型请求只声明模拟工具,并区分只回复文字、工具未开始执行和轮次报错。
68
+
69
+ 2026-11-05,beta.6 在 Mac mini 上的模拟任务 `0590f6cb` 从大肥鱼入队,在 Jarvis 完成后回到原大肥鱼会话。0.1.0 沿用该版本的模拟交接实现。实机截图确认桌面会话生成了完成回复。
70
+
67
71
  实机顺序:主人私聊发送「让 Jarvis 做交接测试 success」→ 拿到编号 → 立即再聊一句 → 等结果;接着连续发两条(等各自收到编号,避免上游合并为一轮),再分别测 failure、timeout、confirmation。最后用同一任务 ID 查询状态,并验证非主人和群聊不会产生任务。断电/重启测试先把相关工作保存,确认测试实例处于安全状态后单独做。
package/module/index.mjs CHANGED
@@ -271,6 +271,7 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
271
271
  return true
272
272
  })
273
273
  if (!accepted) return { ok: false, message: '该模拟步骤已执行或已失效。' }
274
+ run.mockStarted = true
274
275
  const signal = AbortSignal.any([run.abort.signal, exec.signal])
275
276
  await delay(task.mode === 'timeout' ? TIMEOUT_DEMO + 10_000 : demoMs, undefined, { signal })
276
277
  if (disposed || broken || signal.aborted || active !== run) return { ok: false, message: '任务已中断。' }
@@ -291,6 +292,14 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
291
292
  if (schemas.length !== 1) throw new Error('Jarvis 模拟工具未进入模型请求。')
292
293
  return { ...prepared, tools: schemas }
293
294
  }, { prepend: true }))
295
+ // An in-history adapter can redeclare tools from an earlier model request.
296
+ // Begin a new declaration series for this message, keeping the chat history.
297
+ run.offs.push(agent.ctx.on('agent/pre-step', async (step, next) => {
298
+ const decision = await next()
299
+ if (step.agent !== agent || decision.kind !== 'enter' ||
300
+ !decision.messages.some(message => message.id === run.messageId)) return decision
301
+ return { ...decision, startsRequestSeries: true }
302
+ }, { prepend: true }))
294
303
  const remaining = registry.schemas(agent).map(t => t.name)
295
304
  if (!remaining.includes(MOCK) || remaining.includes('run_code')) throw new Error(isolationError)
296
305
  changed(tasks => {
@@ -333,6 +342,26 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
333
342
  }
334
343
  }
335
344
 
345
+ function turnFailure(run, reason) {
346
+ switch (reason?.kind) {
347
+ case 'completed':
348
+ if (run.mockStarted) return 'Jarvis 的模拟工具已开始执行,但没有返回结果。'
349
+ if (run.mockRequested) return 'Jarvis 请求了模拟工具,但工具没有开始执行。'
350
+ return 'Jarvis 已结束这一轮,但没有调用模拟工具。'
351
+ case 'error':
352
+ return 'Jarvis 轮次出错,请打开 Jarvis 的轨迹查看错误详情。'
353
+ case 'aborted':
354
+ case 'interrupted':
355
+ return 'Jarvis 轮次被中断。'
356
+ case 'max-tokens':
357
+ return 'Jarvis 轮次达到了输出长度上限。'
358
+ case 'blocked':
359
+ return 'Jarvis 轮次在执行前被宿主拦截。'
360
+ default:
361
+ return 'Jarvis 未记录正常的轮次结束。'
362
+ }
363
+ }
364
+
336
365
  // Follow the native turn boundary. A completed unrelated turn cannot settle this task.
337
366
  const replies = new Map()
338
367
  function releaseReply(sid, pending) {
@@ -348,10 +377,11 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
348
377
  if (run && sid === run.target) {
349
378
  if (event.type === 'turn/start') run.openTurn = event.data.turn
350
379
  if (event.type === 'user/message' && event.data.id === run.messageId) run.turn = run.openTurn
380
+ if (event.type === 'tool/call' && event.data.turn === run.turn && event.data.name === MOCK) run.mockRequested = true
351
381
  if (event.type === 'turn/end' && event.data.turn === run.turn) {
352
382
  const out = now() >= run.deadline ? ['timed_out', '模拟任务超时,未自动重试。'] :
353
383
  event.data.reason?.kind === 'completed' ? run.outcome : undefined
354
- finish(run.id, ...(out ?? ['failed', 'Jarvis 轮次未正常完成,或没有执行模拟步骤。']))
384
+ finish(run.id, ...(out ?? ['failed', turnFailure(run, event.data.reason)]))
355
385
  }
356
386
  }
357
387
  const pending = replies.get(sid)
@@ -453,7 +483,7 @@ export function setupHandoff(api, { now = Date.now, delay = sleep, demoMs = 20_0
453
483
  export default {
454
484
  id: ID,
455
485
  name: 'Jarvis 跨会话交接(模拟)',
456
- version: '0.1.0-beta.5',
486
+ version: '0.1.0',
457
487
  api: 1,
458
488
  description: '把主人私聊的模拟任务交给指定 Jarvis 会话并回传结果。',
459
489
  settings: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rezti/dsh-rez-task-handoff",
3
- "version": "0.1.0-beta.5",
3
+ "version": "0.1.0",
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",
@@ -22,6 +22,6 @@
22
22
  "publishConfig": {
23
23
  "registry": "https://registry.npmjs.org/",
24
24
  "access": "public",
25
- "tag": "beta"
25
+ "tag": "latest"
26
26
  }
27
27
  }