Skip to content
签到签到

4. 整体架构

4.1 架构风格

从源码和文档可以判断,这不是传统 MVC,而是:

  • 插件化微内核 / 可组合运行时:所有产品能力都通过插件挂到 ctx
  • 事件驱动与事件溯源混合:typed events 负责扩展点,Session log 负责持久真相。
  • capability seam 分层:Service Definition / Provider / Consumer 分离。
  • Host / Browser 双插件树:同一套 Cordis 思想贯穿后端和前端。
  • 类型安全 RPC:Typert 从 Host 类型生成客户端契约。

判断依据:

4.2 模块划分

模块名称主要职责对外接口上游依赖下游依赖核心主要源码位置
core/sessionappend-only 会话日志与内存 storectx.sessionsSessionSessionEventdsh-llmdsh-scope几乎所有模块packages/core/session/src/
core/system-prompt组装 prompt、context、tool schema、变量ctx.systemPromptdsh-scopedsh-llmagent-looptoolspackages/core/system-prompt/src/index.ts
core/tools工具注册、展示、执行管线ctx.toolsdsh-system-promptdsh-scopeagent-loop、所有 dsh-tool-*packages/core/tools/src/index.ts
core/agentAgent 公共接口、registry、事件词汇ctx.agentsdsh-sessiondsh-llmUI、protocol、looppackages/core/agent/src/index.ts
core/agent-loop默认 Agent 驱动器ctx.agentLoopagentssessionsllmtoolssystemPrompt无(实现)packages/core/agent-loop/src/
core/scopeper-agent scoped registration 原语library,无 ctx keysessionsystem-prompttoolspackages/core/scope/src/
llm/llm模型消息、stream、adapter registryctx.llmCordisagent-loopllm-deepseekllm-pi-aipackages/llm/llm/src/index.ts
session/session-persistence持久化 seam 和 coordinatorctx.sessionPersistencedsh-sessionJSONL/SQLite 后端packages/session/session-persistence/src/
session/session-projection从事件流驱动纯投影ctx.sessionProjectionsdsh-sessiontoken meter、UI carriers重要packages/session/session-projection/src/index.ts
boot/app-bootprofile 发现、patch 组合函数 APICordis loaderCLIpackages/boot/app-boot/src/profile.ts
apps/clidsh 启动器CLIapp-boot、bundlesapps/cli/src/bin.ts
api/session-controllerHost 分页/跟随传输、Client Session 与快照page/follow、client servicesSession Log、wire/RPCUI 插件packages/api/session-controller/src/
client/ui-conversation + ui-renderer对话节点装配、React 外部 Store 桥与 keyed Slotassembler、slot rendererClient Session、ui-slotsReact UIpackages/client/ui-conversation/src/packages/client/ui-renderer/src/
client/ui-slotsslot registry 核心与 props 类型slot APIruntimeUI 插件packages/client/ui-slots/
typert/*类型图生成、加载、运行时 registryTypertTypeScript AST/type systemAPI gateway、SDK重要packages/typert/
sdk/*JSON-RPC 协议、server、TS clientSDKdsh-agent、Typert外部自动化重要packages/sdk/
bundle/*安装式 profile patch layersbundle patchbase + mode重要packages/bundle/base/cordis.patch.yml

4.3 架构图

打开交互图解:整体系统与插件边界

4.4 核心数据流

选择最典型的 dsh --profile headless "run the tests",因为它绕过 Web UI 和 ACP,最能直接暴露核心 loop。

  1. CLI 解析命令:apps/cli/src/bin.ts:27-53
  2. profile 组合:apps/cli/src/profile-boot.ts:207-259
  3. dsh-headless 的 runner 创建 Agent、提交任务、等待空闲:packages/bundle/headless/README.md:7-11
  4. ReactLoopAgent.turn() 打开 turn,preStep() 组装请求,step() 派生历史并调用模型。
  5. 模型返回工具调用时,executeToolCalls() 调用 ctx.tools
  6. 每一步都写 turn/startstep/startuser/messageassistant/messagetool/resultstep/endturn/end 等 Session event。
  7. headless runner flush 后从持久事件区间提取最后 assistant 文本并退出。

4.5 启动流程

打开交互图解:一次 Agent Turn

关键源码:

  • packages/boot/app-boot/src/profile.ts:371-403 解析 profile 和 bundle patch。
  • packages/boot/app-boot/src/profile.ts:413-419 将 layers 合并成 entry list。
  • apps/cli/src/profile-boot.ts:248-259 调用 boot() 并注入 commandline/env。
  • packages/core/agent-loop/src/index.ts:349-381 注册 factory 和配置驱动 agents。

4.6 关键调用链

入口:

text
agent.followup(userMessage)

调用链:

text
packages/core/agent-loop/src/agent.ts:122
-> Agent.send(message, 'next-turn', true)
-> packages/core/agent-loop/src/agent.ts:113-120
-> Inbox.splice + wakeDriver
-> packages/core/agent-loop/src/agent.ts:172-193
-> withInitiator -> kick()
-> packages/core/agent-loop/src/agent.ts:210-223
-> turn()
-> packages/core/agent-loop/src/agent.ts:246-330
-> preStep()
-> packages/core/agent-loop/src/agent.ts:225-243
-> ctx.systemPrompt.assemble(assembleContextFor(this, signal))
-> runtimeContext.project(joinContextSections(sections), sections)
-> ctx.waterfall('agent/pre-step')
-> session.append('step/start')
-> session.append('user/message')
-> step(assembly)
-> packages/core/agent-loop/src/agent.ts:332-401
-> buildRequest()
-> session.deriveMessages()
-> ctx.llm.prepareCall()
-> preparedCall.stream(request) or ctx.llm.stream(request)
-> for await chunk -> session.append('assistant/chunk')
-> assembler.finish -> createAssistantMessage
-> session.append('assistant/message')
-> if tool calls -> executeToolCalls()
-> packages/core/agent-loop/src/tool-calls.ts:67-204
-> ctx.tools scheduler prepare/dispatch/finalize
-> session.append('tool/result')
-> repeat step while tools owe request or steering arrives
-> session.append('step/end')
-> dispatch.serial('agent/turn-stopping')
-> session.append('turn/end')

每一步的依据都在上述行号附近,属于已验证源码结构。