Files
cc-web/.planning/2026-08-27-javascript-conversation-events/findings.md

3.3 KiB
Raw Blame History

Findings

  • Git main 起点干净并与 origin/main 同步。
  • codebase-memory 项目 home-cc-web 索引状态为 ready
  • 会话运行状态的统一判定入口是 server.js 中的 isSessionRunning
  • 标准包源码由 lib/javascript-session-runtime.jspackageIndexSource 动态注入。
  • 内部脚本能力通过 handleSessionCall 映射到 server.js 注入的 sessionApi
  • 会话列表刷新入口是 broadcastSessionList,但 idle 边沿不能仅依赖 UI 广播,需要服务端可等待的状态协议或包内封装。
  • isSessionRunning 由多个活动 Map/goal 状态综合推导;查询 API 必须直接复用它,不能另造状态字段。
  • 当前注入包的 HTTP call() 是短请求模型;最小可靠实现是新增服务端状态查询,监听和边沿判定由 @ccweb/session 内部封装,调用脚本不需要自行轮询。
  • onConversationEvent 适合设计为异步注册:const unsubscribe = await onConversationEvent(...),注册阶段先验证会话并取得基线状态;注销函数同步停止计时器。
  • scriptsDirFor(..., create=true) 目前只在包入口不存在时写入;若不调整,已有 .ccweb/scripts 无法获得新增导出,因此生成包入口应在内容变化时原子刷新。
  • 现有运行时单测包含真实注入包 + 本地 HTTP MCP 的端到端骨架,可扩展为状态序列与注销验证。
  • “等待子对话回复”已有统一来源:crossConversationWaitState(sessionId).waitingOnChildren,其范围包括 waitingreadydeliveringfailed 的未处理跨对话回复。
  • 状态优先级采用 running > waiting_for_children > idle,避免会话自身仍在执行时被较弱等待态覆盖。
  • 持久子对话关系保存在 session meta 的 createdFromKind='mcp'createdFromSourceSessionIdlistConversationSummaries(scope='children') 已验证该筛选语义。
  • 新增 getChildConversationIds 只返回直接子对话,按现有会话列表排序后提取 ID不递归包含孙对话。
  • 协议定型:公开 onConversationEvent 使用异步注册并返回同步注销函数;包内每 100ms 串行查询状态,不产生重叠请求,调用脚本无需自行轮询。
  • idle 事件 payload 为 { conversationId, event, previousStatus, status, occurredAt };只允许事件名 idle
  • 注册时先取得基线:初始为 idle 不触发后续任一活动态running / waiting_for_children转 idle 才触发。
  • 注销会清理定时器;已在途的状态请求返回后也会先检查 active 标记,因此不会产生注销后的新回调。
  • 监听器同步抛错或返回 rejected Promise 时不静默吞掉,按脚本未捕获异常处理;状态查询故障也停止监听并使脚本异常退出。
  • 动态包版本提升到 1.1.0,并在创建/写入/运行脚本时原子刷新生成的包入口,确保已有脚本目录获得新导出。
  • 用户明确要求抑制等待态登记延迟产生的临时 idle服务端 idle 查询先等待 500ms 后复核,包内事件再要求 idle 连续稳定 250ms任一时刻观察到 waiting_for_children 都取消 idle 候选。
  • 子对话元数据可直接使用 compareSessionsForList 排序,返回顺序与会话列表一致(置顶优先,其次最近更新)。