← MyInfoLib
Created: 2026-02-19Source: GitHub Repo

LobsterAI 硬核机制拆解:沙箱实现 + 记忆机制设计

你要的不是趋势,而是代码。下面只讲两件事:沙箱怎么跑起来,以及记忆怎么被提取/评审/落库

一、沙箱机制(代码级调用链)

1) 执行入口与模式分流(coworkRunner.ts

  1. runClaudeCode() 先做路径与附件检查(尤其附件是否在 cwd 内)。
  2. 若已有活跃 VM(sandboxProcess + ipcBridge),走 continueSandboxTurn() 复用同一 VM。
  3. executionMode=local 直接 runClaudeCodeLocal()
  4. 否则检查 ensureSandboxReady();sandbox 强制模式失败会报错,auto 模式可能回退 local。

关键点:这是“策略层”,不是直接 spawn VM。

2) VM 运行时准备(coworkSandboxRuntime.ts

const runtimeDir = path.join(baseDir, 'runtime', version)
const imagePath  = path.join(imageDir, `linux-${process.arch}.qcow2`)

3) QEMU 启动参数拼装(coworkVmRunner.ts

跨平台 IPC 差异(重点)

平台共享机制代码路径
macOS / Linux9p virtfs 挂载(ipc/work/skills)-virtfs local,path=...,mount_tag=...
Windows不用 9p,改用 virtio-serial + TCP bridgeVirtioSerialBridge + findFreePort()

这就是为什么 Windows 路径有额外“pushFile”逻辑:它没有 9p,技能文件要通过 serial 分块同步进 VM。

4) VM 内外请求协议(文件模式 + serial 模式)

if (messageType === 'permission_request') {
  emit('permissionRequest', sessionId, request)
  // 用户确认后 writeSandboxPermissionResponse(...)
}

5) 可恢复与降级策略

架构取舍:保证“能跑”优先(auto fallback),但会引入“安全语义变动”风险(从隔离执行回到本机执行)。

二、记忆机制(从对话到 user_memories)

1) 数据结构(SQLite)

2) 提取器(coworkMemoryExtractor.ts

这是规则引擎,不靠玄学:

if (SMALL_TALK_RE.test(trimmed)) return false
if (isQuestionLikeMemoryText(trimmed)) return false
if (PROCEDURAL_CANDIDATE_RE.test(trimmed)) return false

核心思想:宁可漏记,不乱记。

3) 评审器(coworkMemoryJudge.ts

4) 写入路径(coworkStore.applyTurnMemoryUpdates()

  1. 提取:extractTurnMemoryChanges(...)
  2. 评审:judgeMemoryCandidate(...)
  3. 写库:createOrReviveUserMemory(...)
  4. 挂来源:用户消息 + 助手消息 source 关联
  5. 回收:markOrphanImplicitMemoriesStale()
const write = this.createOrReviveUserMemory({ text, confidence, isExplicit, source })
if (!change.isExplicit && assistantMessageId) {
  this.addMemorySource(write.memory.id, { role:'assistant', ... })
}

5) 删除语义不是“精确匹配”

删除走 scoreDeleteMatch(),会从候选记忆里算最相近目标再删除。这样能处理“近似表达删除”,但也带来误删边界,需要 guard。

三、你最该在本地打断点的函数

CoworkRunner.runClaudeCode
CoworkRunner.runClaudeCodeInSandbox
spawnCoworkSandboxVm
VirtioSerialBridge.connect / pushFile
CoworkRunner.waitForVmReady
extractTurnMemoryChanges
judgeMemoryCandidate
CoworkStore.applyTurnMemoryUpdates

四、一句硬结论

LobsterAI 的难点不是“调模型”,而是“把 VM 执行协议和记忆生命周期做成稳定系统”。这两块做稳了,它就不是 Demo,而是可长期运行的 Agent Runtime。