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 查询进度。
会话身份
| 来源 | 标识 | 目录 |
|---|---|---|
agent | Agent ID | Desktop 固定的 main 目录 |
work | SDK 生成 | 显式指定的项目 Workspace |
task | SDK 生成 | 任务定义指定的执行目录 |
group | SDK 生成 | 群聊执行上下文指定的目录 |
agent.sessions.list() 默认只列出 work 分区,因此主会话不会混入项目会话列表。归档或删除主会话后,再次取用会重建会话,专属 main 目录中的文件仍独立于会话历史。