自进化:

Harness RSI

tool rsi

根据tool的调度次数统计,动态调整每天的工具prompt。

memory rsi

基于用户的消费情况及消费当次的session,利用记忆回调机制,完成memory 重写。

第一层:Redis TTL 自动过期(秒级)

通过分布式锁 RedisDistributedLock 使用 SET key value NX EX ttl 原语实现。tryAcquire 时写入一个随机 UUID 作为 owner,同时设置 TTL。

断电时,持有锁的节点无法续期,Redis key 在 TTL 到期后自动删除,其他节点就可以正常获取锁。这是 Redis 分布式锁最基础的容错机制——不依赖客户端主动释放。

第二层:双层心跳假死检测(分钟级)

但光靠锁 TTL 不够——锁释放了,任务状态还卡在 RUNNING,数据库里这条记录就永远僵死了。所以 Octopus-Hub 设计了一个双层心跳机制来判断任务是否真的还在运行。

第一层心跳:run 级 agenticHeartbeat。 每个正在执行的 AgenticRun 在 CheckpointService 中维护一个 Redis key maestro:task:heartbeat:{taskId}:{taskInstanceId}。CheckpointMaestroListener 在每次事件回调(onRoleStart、onRoleDone 等)时调用 checkpointService.refreshHeartbeat() 刷新这个 key。

第二层心跳:task 级 taskHeartbeat。 TaskHeartbeatService 为每个任务实例启动一个独立的虚拟线程 daemon,每 30 秒向 Redis 写一次心跳 key,TTL 设为 90 秒(interval × 3)。

AgenticRecoverySchedulerXJob 是一个由 SchedulerX 定时调度的 Job,负责扫描并恢复假死任务。它每次被调度时先刷新自己的心跳(防止调度器本身被判定为假死),然后执行 5 个阶段的扫描:

  1. 扫描 SCHEDULED/PERCEPTION/SENSING 状态的任务,过滤掉心跳仍存活的,对真正假死的任务分发 recover 子任务。
  2. 扫描 stalled 的 Direct 模式任务,没心跳则直接 force-fail
  3. 扫描心跳超时但有 pendingCorrelationId 的 NORMAL 任务,走 recover 恢复回调监听
  4. 扫描 pendingDetached 超时的任务
  5. 其他边界场景

恢复流程会从 checkpoint_data 中重建 RunContext,从上次中断的轮次继续执行——因为每轮结束后状态都被持久化到了 checkpoint。