7.5 KiB
搜索词与判断树
先判断层级
history + logs / id 反查层
当现象是“用户只给了一个 id”“需要判断它是 conversationId、requestId、modelCallId、toolCallId”“要从本地 history 和日志追状态”:
优先搜索:
state.jsoncontext.jsonusage.jsonlogs/app.logconversation_idcurrent_request_idrequest_idmodel_call_idtool_call_idlatest_request_prefixlast_provider_callcurrent_loop_statuscontext_versionnext_entry_seqnext_turn_seqLoadConversationCreateConversationSaveConversationWithEntriesAppendEntriesUpdateConversationMetaReplaceEntriesProjectPromptReplayUsageFileStoreUpsertEventLookupEvent
不要再优先搜索或依赖:
data.sqliteprotocol_tracesagent_request_runsconversation.jsonentries.jsonlturns/<n>request.jsonsse.jsonlsummary.json
这些是旧实现或 legacy artifact 相关线索,只在排查迁移/清理逻辑时作为历史背景。
cursor-agent-exec / cursor-agent-worker 层
当现象涉及 agent 主循环、模型桥接、InteractionUpdate 映射、工具 started/completed、session/provider 状态:
优先在已安装客户端 split bundle 中搜索:
/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-agent-exec/dist/main.js/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-agent-exec/dist/*.js/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-agent-worker/dist/main.js
优先搜索:
registerAgentProviderCursorAgentProviderCursorAgentProviderHandleClaudeSDKClientstreamInteractionUpdateshandlePartialMessageAnthropicProxygetAnthropicProxyPortgetAnthropicProxyAuthTokenANTHROPIC_BASE_URLANTHROPIC_API_KEYInteractionUpdatecheckpoint
旧路径 /Applications/Cursor.app/Contents/Resources/app/extensions/cursor-agent/dist/main.js 可能不存在。先确认实际 extensions/ 结构,再按 cursor-agent-exec / cursor-agent-worker / cursor-always-local 分层排查。
agent window / conversation metadata UI 层
当现象涉及 agent window 标题、窗口信息、titlebar 按钮、是否可点击修改、会话名/metadata 更新:
优先在已安装客户端主 UI 和 split bundle 中搜索:
/Applications/Cursor.app/Contents/Resources/app/out/vs/workbench/workbench.desktop.main.js/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-agent-exec/dist/main.js/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-agent-exec/dist/*.js/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-always-local/dist/main.js
优先搜索:
shouldShowAgentWindowTitleHelperTextglass_open_agents_titlebar_buttonopen_agent_window_topopen_agent_window_bottom_convoglass.enable_open_agent_in_windowNameAgentRequestNameAgentResponseUpdateConversationMetadataRequestUpdateConversationMetadataResponseCreateTranscriptOverviewRequestcreateTranscriptOverviewupdateConversationMetadataconversation_checkpoint_update
判断规则:
ConversationStateStructure/conversation_checkpoint_update是 UI 同步快照,不应作为持久化修改入口。- 如果客户端调用
UpdateConversationMetadata/NameAgent,要继续确认本地后端是否显式注册对应/agent.v1.AgentService/*路由;不能只看 proto message 存在。 - 本地模式修改会话名/metadata 时,应落到
history/<conversationId>/state.json或等价持久化会话元数据,再 publish checkpoint 同步 UI。
cursor-always-local / 协议层
当现象涉及本地模式、客户端没有回包、pending 不收口、同一 backend 进程内的 live checkpoint 重连错乱:
优先搜索:
BidiTransportstartYieldingInputsToTheServerBidiAppendRunSSEAgentServerMessageAgentClientMessageExecServerMessageExecClientMessageExecClientControlMessageInteractionQueryInteractionResponseconversation_checkpoint_update
本仓库 forwarder 层
当现象涉及本地后端收发、provider 继续/暂停、exec/interaction 桥接、history 投影:
优先搜索:
handleRunIntentdriveProviderstartStreamActorstreamCommandEnvelopehandleToolInvocationhandleExecResulthandleExecControlpublishCheckpointCheckpointConversationsnapshotCheckpointConversationappendConversationEntriesOpenExecOpenQueryStartStreamderiveConversationLoopStatehistoryEntryToolCallIDrecordProviderUsagerecordTurnUsage
provider / 模型适配层
当现象是 provider 400/500、thinking/reasoning、tool_call_id、OpenAI/Anthropic 请求形状、usage/cache 不对:
优先搜索:
StartStreamStreamRequestResolvedChannelIDResolvedChannelNameProviderModelIDThinkingEnabledbuildAnthropicThinkingConfignormalizeAnthropicProviderMessagesnormalizeOpenAIProviderMessagesnormalizeOpenAIResponsesInputreasoning_contentReasoningContentReasoningSignatureRecordLLMRequestRecordLLMSummaryhttp_errornamespaceToolCallID
快速判断规则
- 如果问题是“给你一个 id,让你先判断是什么 ID,再找日志”,先看
history/<id>/state.json是否存在,再扫history/*/state.json、history/*/context.json和logs/app.log。 - 如果问题是“模型输出语义不对”,先看
context.json.items到ProjectPromptReplay()的投影,再看 provider request normalization。 - 如果问题是“provider 报 400/参数错误”,先看模型适配层请求构造、
state.latest_request_prefix、state.last_provider_call、logs/app.log。 - 如果问题是“客户端没回某个工具结果 / pending 不收口”,先看
cursor-always-local与 forwarder,同时核对同一turn_seq是否有tool_result或控制面错误 entry。 - 如果问题是“backend 重启后为什么 checkpoint 没法继续恢复 pending”,不要找磁盘 checkpoint;checkpoint 是 live state,重启后的事实源是
state.json + context.json。 - 如果问题是“为什么同一个
modelID还能出现多个渠道”,先检查渠道 ID:规范化后baseURL + modelID + apiKey + displayName + openAIEndpoint的短 SHA-256;resolver 仍兼容 legacybaseURL + modelID + apiKey + displayName。 - 如果问题是“只想桥接到其他 LLM”,优先看模型桥接层,不要默认深入整套 local runtime。
- 如果问题是“已安装 app 行为和仓库代码不一致”,先核对实际运行 bundle,再做只读比对;不要 patch 客户端。
协议关键词
上行:
run_requestexec_client_messageexec_client_control_messageinteraction_response
下行:
interaction_updateexec_server_messageexec_server_control_messageinteraction_queryconversation_checkpoint_update
如果只看到下行请求,没有对应上行结果或控制消息,优先排查:
exec_ididtool_call_idrequest_idmodel_call_id- pending 收口逻辑
如果用户给的是一个裸 id,不要直接把它当成 request_id。先同时查:
history/<id>/state.jsonhistory/*/state.json的current_request_id、latest_request_prefix、last_provider_callhistory/*/context.json的items[].request_id、items[].tool_call_id、items[].payloadhistory/usage.json的event_index/recent_eventslogs/app.log