Agent 主会话

主会话在自己的 main 目录中持续对话,工作会话在明确指定的项目中执行

Agent 主会话的 origin.type 是 agent,session_id 等于 Agent 的 id。它保存用户与 Agent 的持续对话,并可以派发、查看、回复和停止工作会话。

Desktop 中的专属目录

Desktop 为每个 Agent 提供固定目录:

~/.downcity/agents/<agent_id>/main/

这是主会话自己的 Workspace,为文件、Shell 和 Power 提供执行环境。它不出现在 Works 项目列表里;切换项目或重新打开 Agent 都不会改变主会话目录。会话消息仍保存在 sessions/agent/<agent_id>/,与 main 中的文件分开。

项目任务由 work 会话执行。派发时必须明确指定项目 Workspace,不能继承主会话的 main 目录。

SDK 取用与恢复

SDK 不决定目录在磁盘上的位置,目录由宿主提供。首次取用可以传入专属 Workspace:

const agent = new Agent({
  id: "coder",
  model,
  resolve_work_workspace: async (workspace_id) => {
    const workspace = project_workspaces.get(workspace_id);
    if (!workspace) throw new Error("Project Workspace not found");
    return workspace;
  },
});

await agent.sessions.self({ workspace: main_workspace });

// self 的 Workspace 只用于创建;已有会话通过 get 明确恢复运行时实例。
const session = await agent.sessions.get(agent.id, "agent", {
  workspace: main_workspace,
});
const turn = await session.prompt({ query: "请检查项目 CI,并派发修复任务" });
await turn.finished;

project_workspaces 和 main_workspace 由宿主创建和持有。resolve_work_workspace 仅解析项目工作目标,不负责恢复主会话,也不自动选择项目。宿主应拒绝未登记的项目与主会话私有目录。

Workspace 实例不落盘,Session 只保存 workspace_id。每次重启后由宿主重新注入实例;仅有持久化 ID 并不意味着文件与 Shell 已经可用。get() 在缓存实例存在但目录实例尚未恢复时也会应用注入。

派发工作

只有 agent 会话拥有以下工具:

工具用途
session_start在明确指定的项目中创建工作会话,接受任务后立即返回
session_check列出工作会话,或读取指定会话的消息与待响应交互
session_reply代答工作会话的审批或问题
session_stop停止指定工作会话

模型先通过 context.workspaces.list 查看可用目录,再提供项目 ID:

session_start({
  workspace_id: "project-workspace-id",
  query: "修复 CI 中失败的三个测试,说明原因与验证结果。",
  title: "修复 CI"
})

工作会话只收到完整任务文本与目标项目目录,不继承主会话历史或私有目录。派发后用户仍可继续与主会话交流,Agent 使用 session_check 查询进度。

会话身份

来源标识目录
agentAgent IDDesktop 固定的 main 目录
workSDK 生成显式指定的项目 Workspace
taskSDK 生成任务定义指定的执行目录
groupSDK 生成群聊执行上下文指定的目录

agent.sessions.list() 默认只列出 work 分区,因此主会话不会混入项目会话列表。归档或删除主会话后,再次取用会重建会话,专属 main 目录中的文件仍独立于会话历史。