# Multica 产品全景文档 > **文档说明** > > 这份文档的目的是:**让任何没有写过代码的新同事,在 30 分钟内完全理解 Multica 这个产品到底有哪些功能、每个功能在整体中处于什么位置、一个功能和另一个功能如何协同**。 > > 它的受众包括: > > - **新加入的工程师 / 产品 / 设计 / 运营**——用它做 onboarding 的第一份材料 > - **产品介绍工作**——需要对外讲解 Multica 时的事实基础 > - **文案工作者**——写交互文案、营销文案、帮助文档时,需要知道某个词(比如 "Skill"、"Runtime"、"Autopilot")在产品体系里代表什么 > - **任何需要在修改某个局部前,先理解它与整体关系的人** > > 它**不是**:开发者文档、架构决策记录(ADR)、或者销售话术。它是**功能事实的汇总**——每一条描述都能在代码、schema 或 API 里找到对应。 > > 文档基于对整个 monorepo(server、apps、packages、migrations、daemon、CLI)的系统性调研生成,数据截止日期 2026-04-21。 --- ## 目录 1. [Multica 是什么](#1-multica-是什么) 2. [核心概念词典](#2-核心概念词典) 3. [功能全景(按模块)](#3-功能全景按模块) - 3.1 [Workspace 工作区](#31-workspace-工作区) - 3.2 [Issue 议题管理](#32-issue-议题管理) - 3.3 [Project 项目](#33-project-项目) - 3.4 [Agent 智能体](#34-agent-智能体) - 3.5 [Runtime 运行时 & Daemon 守护进程](#35-runtime-运行时--daemon-守护进程) - 3.6 [Skill 技能](#36-skill-技能) - 3.7 [Autopilot 自动驾驶](#37-autopilot-自动驾驶) - 3.8 [Chat 对话](#38-chat-对话) - 3.9 [Inbox 收件箱与通知](#39-inbox-收件箱与通知) - 3.10 [成员、邀请与权限](#310-成员邀请与权限) - 3.11 [搜索与命令面板](#311-搜索与命令面板) - 3.12 [认证、登录与 Onboarding](#312-认证登录与-onboarding) - 3.13 [设置与个人资料](#313-设置与个人资料) - 3.14 [CLI 命令行工具](#314-cli-命令行工具) 4. [系统架构全景](#4-系统架构全景) 5. [产品地图(全部路由)](#5-产品地图全部路由) 6. [跨平台差异:Web vs 桌面](#6-跨平台差异web-vs-桌面) 7. [附录:关键数据表速查](#7-附录关键数据表速查) --- ## 1. Multica 是什么 ### 一句话定位 **Multica 把编码智能体变成真正的团队成员。** 像给同事分配任务一样,把一个 issue 指派给一个 agent,它会自己认领、写代码、汇报进度、更新状态——不需要你一直守着。 ### 解决的问题 传统方式用 AI coding agent 的痛点: - 每次都要复制粘贴 prompt - 必须盯着终端,看它跑不跑得完 - 没有跨任务的记忆,每次都从零开始 - 多个 agent 同时工作时,没有一个"看板"能看到全局 Multica 做的事: - Agent 和人**共用同一个任务看板**(issue board) - Agent **有 profile**,会出现在 assignee 下拉里、会在评论区发言、会自己创建 issue - 同一个 (agent, issue) 的多轮对话**自动恢复会话**——上一次的上下文、工作目录都保留 - **Skill 系统**让历史上解决过的问题沉淀成可复用的能力 - **Autopilot** 让 agent 按定时规则自动开工(比如每天早上 9 点做 bug triage) ### 定位一句话版本 > Multica 不是一个 AI 工具,而是一个**人 + AI 协作的任务管理平台**。agent 是一等公民,和人在同一个工作流里。 ### 部署形态 - **云版本(Multica Cloud)**:官方托管服务,agent 通过你本地跑的 daemon 执行 - **自托管(Self-Host)**:完整后端可以部署在自己的服务器 - **客户端**:Next.js web 版 + Electron 桌面版(两端体验基本一致,桌面独有:多标签、原生托盘、自动更新) ### 支持的 Coding Agent Multica **不自己训模型**,也不锁定某一家厂商。它是调度器,本地 daemon 会自动探测以下 CLI 工具并接入: Claude Code · Codex · OpenClaw · OpenCode · Hermes · Gemini · Pi · Cursor Agent · Kimi · Kiro CLI 每个 agent 可以配置自己的模型、API Key、环境变量、MCP 服务器。 --- ## 2. 核心概念词典 **理解这些名词是理解产品的前提。每个概念的定义都严格对应数据库表。** | 概念 | 定义 | 映射的数据表 | |------|------|-------------| | **User 用户** | 一个人类账号,可以登录,属于多个 workspace | `user` | | **Workspace 工作区** | 一切资源的容器。issue、agent、project、skill 全部隔离在 workspace 里。就是 Linear/Notion 里的 workspace/team 概念 | `workspace` | | **Member 成员** | 用户在某个 workspace 里的身份。一个用户在不同 workspace 可以有不同角色(owner/admin/member) | `member` | | **Agent 智能体** | 可被指派任务的 AI 工作者。有 profile(名字、头像、说明)、会指定 runtime 和 provider、可以配自定义 prompt 和技能 | `agent` | | **Runtime 运行时** | Agent 实际跑在哪里的**执行环境**。可以是用户本地机器(通过 daemon)或云端实例。**一个 runtime = 一台可以跑 agent 的机器** | `agent_runtime` | | **Daemon 守护进程** | 用户本地运行的后台程序,自动发现已安装的 coding CLI 并注册为 runtime,然后不停轮询 server 认领任务 | (进程,不是表) | | **Issue 议题** | 一个工作单元——任务、bug、feature。最核心的产品对象。可以分配给人或 agent | `issue` | | **Comment 评论** | Issue 下的讨论回复。人和 agent 都能发。在评论里 `@某个 agent` 会自动触发这个 agent 的新任务 | `comment` | | **Task 任务** | Agent 执行一次 issue 所产生的一次运行。本质是"一次 agent 跑起来的会话"。队列化执行 | `agent_task_queue` | | **Skill 技能** | 工作区级别的可复用说明文档。作用是给 agent 提供"怎么做某件事"的上下文。Agent 开跑时会把挂载的 skill 内容注入到工作目录让 CLI 能读到 | `skill`, `skill_file`, `agent_skill` | | **Project 项目** | 议题的高层归属,类似"里程碑"或"版本"。issue 可以归属到 project | `project` | | **Autopilot 自动驾驶** | 定时或被触发的自动化规则。按 cron 或 webhook 触发,自动创建 issue 并分配给 agent | `autopilot`, `autopilot_trigger`, `autopilot_run` | | **Chat 对话** | 用户和 agent 的持久化多轮对话。不依附于 issue | `chat_session`, `chat_message` | | **Inbox 收件箱** | 个人通知中心。被 @、被分配、订阅的 issue 有更新都会进这里 | `inbox_item` | | **Subscriber 订阅者** | 谁关注某个 issue。被分配、被 @、评论过都会自动订阅。订阅者会收到 inbox 通知 | `issue_subscriber` | | **Activity 活动 / Timeline 时间线** | 所有关键动作的审计记录。issue 详情页的"时间线"就是这个表的数据 | `activity_log` | | **Pin 固定** | 个人侧边栏快捷方式,把常用的 issue/project 置顶 | `pinned_item` | | **Reaction 反应** | Issue 或评论上的 emoji 反应,跟 GitHub/Slack 一样 | `issue_reaction`, `comment_reaction` | | **Attachment 附件** | Issue 或评论的文件上传,支持 S3/CloudFront 或本地存储 | `attachment` | | **Personal Access Token (PAT)** | 用户级 API token,CLI 和自动化用。`mul_` 前缀 | `personal_access_token` | | **Daemon Token** | 单 workspace 单 daemon 的 token。`mdt_` 前缀,比 PAT 权限范围更小 | `daemon_token` | | **Session Resumption 会话恢复** | 同一对 (agent, issue) 的下一次任务会自动复用上次 Claude Code 的 `session_id` 和工作目录——历史对话、文件状态都保留 | `agent_task_queue.session_id`, `.work_dir` | | **MCP (Model Context Protocol)** | Anthropic 提出的协议,让 agent 通过标准接口调用外部工具。每个 agent 可配自己的 MCP server 列表 | `agent.mcp_config` (JSONB) | | **Workspace Context 工作区上下文** | 工作区级别的 agent 系统提示词。所有该工作区的 agent 都会感知到它 | `workspace.context` | | **Polymorphic Actor 多态行动者** | 设计范式:几乎所有"谁做了什么"的字段都是 `actor_type` (`member`/`agent`) + `actor_id`。这就是为什么 agent 能像人一样创建 issue、发评论、被订阅 | 贯穿所有表 | --- ## 3. 功能全景(按模块) ### 3.1 Workspace 工作区 > **角色**:一切的容器。Multica 的多租户边界。 #### 功能 - **多工作区**:一个用户可以属于多个 workspace,每个 workspace 完全隔离(issue、agent、skill、成员都独立)。 - **创建工作区**:只需要一个名字;自动生成 slug(URL 中使用的短 ID)。 - **切换工作区**:侧边栏下拉;桌面端每个工作区有独立的标签组。 - **离开工作区**:非 owner 成员可自行离开。 - **删除工作区**:只有 owner 可以,硬删除+级联。 - **Workspace 设置**:名称、slug、描述、**Workspace Context**(给该工作区所有 agent 的统一系统提示)、**仓库列表**(workspace 允许 agent 访问的 Git 仓库 URL 白名单)。 - **Workspace 头像 / issue 前缀**:每个工作区可以有自己的 issue 编号前缀(如 `ACME-42`)。 #### 产品里的位置 Workspace 不是一个功能,而是**所有功能的坐标系**。URL 的形态永远是 `/{workspace-slug}/...`,API 请求永远带 `X-Workspace-Slug` 头。一个 issue、一个 agent、一个 skill,脱离了 workspace 就没有意义。 #### 对应表 `workspace`, `member`, `workspace_invitation` --- ### 3.2 Issue 议题管理 > **角色**:Multica 的核心工作对象。 Issue 对应的概念在 Linear 叫 Issue、在 Jira 叫 Ticket、在 GitHub 叫 Issue——就是一个任务单元。Multica 的特色在于**issue 可以分配给 agent,和分配给人完全对等**。 #### 核心字段 - 标题、描述(Tiptap 富文本)、状态、优先级 - 编号(自动递增,带 workspace 前缀) - **Assignee(可以是 member 或 agent)** - **Creator(可以是 member 或 agent)**——agent 也能创建 issue - Parent issue(用来做子任务) - Project(归属的项目) - Due date(截止日期) - Labels(多对多标签) - Dependencies(依赖/阻塞关系) - Acceptance criteria(验收标准,JSONB) - Origin(如果是 autopilot 创建的,会记录来源 autopilot run) #### 视图 - **List 列表视图**:表格形式,可按 status/priority/assignee/creator/project 过滤、按名称/优先级/截止日/手动位置排序;支持开放和已完成分页。 - **Board 看板视图**:Kanban,按状态分列;支持拖拽(拖动会自动切到"手动排序"模式)。 - **My Issues 我的议题**:专属视图,三个 scope:分配给我 / 我创建的 / 我的 agent 负责的。 #### 交互 - **快速创建**:侧边栏单行快速创建、或弹窗富文本创建(支持草稿本地持久化) - **批量操作**:多选后批量改 status/priority/assignee/删除 - **子 issue**:父 issue 显示子任务完成比例圆环 - **订阅(subscribe)**:默认 creator、assignee、被 @ 的人会自动订阅 - **Reaction**:issue 和评论都能加 emoji 反应 - **Pin 固定**:把 issue 置顶到侧边栏快捷栏 - **复制链接 / 快捷键跳转(Cmd+K)** - **Timeline 时间线**:所有关键动作(状态变更、指派变更、评论)按时间顺序展示,混合 `activity_log` + `comment` 两类记录 #### 评论与讨论 - Tiptap 富文本编辑器,支持 `@` 提到 member 或 agent - 嵌套回复(一层) - emoji 反应 - **@agent 触发任务**:在评论里提到某个 agent,会自动生成一个新的 agent task,让它来回复/处理 #### 附件 - 拖拽上传或按钮上传 - 图片内联预览 - 存储后端:S3/CloudFront 或本地磁盘(自托管) #### 产品里的位置 Issue 是**所有工作流的载体**: - Agent 通过"被分配到 issue"获得任务 - Autopilot 通过"创建 issue"来触发 agent - 评论通过"@agent" 追加任务 - Inbox 通知围绕 issue 生成 #### 对应表 `issue`, `comment`, `issue_label`, `issue_to_label`, `issue_dependency`, `issue_subscriber`, `issue_reaction`, `comment_reaction`, `attachment`, `activity_log`, `pinned_item` --- ### 3.3 Project 项目 > **角色**:多个 issue 的高层容器,类似 Linear 的 Project、Jira 的 Epic。 #### 功能 - 标题、描述、图标(emoji 或标识符) - 状态:`planned` / `in_progress` / `paused` / `completed` / `cancelled` - 优先级:urgent / high / medium / low / none - **Lead 负责人**:可以是 member 或 agent(跟 issue 的 assignee 一样是多态) - 详情页展示项目内的所有 issue - 支持搜索项目 #### 产品里的位置 Project 相比 Issue 是更高层的组织单元。一个 issue 可以不属于任何 project,但如果属于,会在列表页的筛选、侧边栏导航、面包屑里集中展示。 #### 对应表 `project` --- ### 3.4 Agent 智能体 > **角色**:AI 工作者。Multica 最独特的对象。 一个 Agent 不是一个"AI 模型",而是一个**带配置的工作者身份**。它有名字、头像、个人描述、说明书(系统提示词)、绑定的运行时、挂载的技能。在 UI 上它和人一样会出现在 assignee 下拉、评论作者、订阅者列表里。 #### 配置字段 - **基本信息**:名字、描述、头像(自动生成) - **Provider**:选择底层是 Claude / Codex / OpenClaw / OpenCode / Hermes / Gemini / Pi / Cursor / Kimi / Kiro 中的哪一个 - **Runtime**:绑定到哪个运行时(即在哪台机器上跑) - **Instructions 说明书**:agent 的系统提示词("你是一个资深工程师...") - **Custom Env**:要注入到 CLI 进程的环境变量(如 `ANTHROPIC_API_KEY`、`ANTHROPIC_BASE_URL`、`CLAUDE_CODE_USE_BEDROCK`) - **Custom Args**:附加给 CLI 的启动参数(如 `--model`, `--thinking`) - **MCP Config**:Model Context Protocol 服务器列表(让 agent 有额外工具能力) - **Max Concurrent Tasks**:同时最多跑几个任务 - **Skills**:关联多个 skill(见 3.6) - **Visibility**:`workspace`(工作区可见)或 `private`(仅创建者可见) #### 状态 - `idle` / `working` / `blocked` / `error` / `offline`——由 runtime heartbeat 决定 - 可以被 archive(软删除) #### 交互 - 在 **Settings → Agents** 页面创建、编辑、归档 - 在 issue 的 assignee 下拉里选择 - 在评论里 `@agent` 触发 - 在 chat 面板里直接聊 #### 产品里的位置 Agent 是 Multica 的灵魂。几乎所有功能都围绕"如何让一个 agent 干活"展开: - Issue 通过分配触发 agent - Skill 通过挂载赋能 agent - Runtime 提供 agent 的运行环境 - Autopilot 调度 agent 自动开工 - Chat 提供 agent 的对话界面 #### 对应表 `agent`, `agent_skill` --- ### 3.5 Runtime 运行时 & Daemon 守护进程 > **角色**:Agent 真正跑起来的物理/虚拟机器。 这是 Multica **分布式执行架构**的核心设计:**agent 不在 server 上运行,而在用户自己的机器上运行**。Server 只做任务调度、状态同步、数据存储。 #### Daemon 是什么 `multica` CLI 在用户的机器上启动一个后台进程(macOS launchd / Linux systemd / Windows 服务风格),它: 1. **自动探测** `$PATH` 上安装的 coding CLI(`claude`, `codex`, `opencode`, `openclaw`, `hermes`, `gemini`, `pi`, `cursor-agent`, `kimi`, `kiro-cli`) 2. 向 server **注册** 为一组 runtime(一个 CLI = 一个 runtime) 3. 每 3 秒 **轮询** 一次 server,有任务就认领 4. 每 15 秒 **心跳**(keepalive),报告自己还活着 5. 认领任务后,在本机的隔离工作目录里**启动 agent CLI**,把 agent 的输出流**实时推回 server** 6. 任务完成后上报结果、token 用量、session id 和工作目录(用于下次恢复) #### Runtime 展示 在 **Settings → Runtimes** 页面可以看到: - 每个 runtime 的名字、提供方(图标)、owner(谁的机器)、状态指示(在线/离线)、last seen 时间 - Ping 诊断:手动戳一下看响应 - Usage 用量:近期的 token 消耗统计 - Activity:任务活动情况 - CLI 安装指引(自托管模式下) - 桌面端独有:**本地 daemon 卡片**,显示本机 daemon 状态、可一键重启 #### Runtime 的生命周期 - **注册**:daemon 启动时 POST `/api/daemon/register` 得到 runtime ID - **在线**:15 秒一次心跳 - **离线**:如果 server 45 秒没收到心跳,把 runtime 标记为离线(server 后台 sweeper 每 30 秒巡检) - **孤儿任务回收**:超过 5 分钟还在 dispatched 或超过 2.5 小时还在 running 的任务,sweeper 会把它标记为失败 - **长期离线 GC**:7 天没心跳且没活跃 agent 的 runtime 会被回收 #### CLI 与 Daemon 的关系 | 命令 | 说明 | |------|------| | `multica setup` | 一键配置:填 URL + 登录 + 启动 daemon | | `multica login` | 浏览器打开 OAuth 登录,保存 90 天 PAT 到 `~/.multica/config.json` | | `multica login --token ` | 无头登录(SSH/CI) | | `multica daemon start` | 后台启动 daemon(写 PID 到 `~/.multica/daemon.pid`,日志到 `~/.multica/daemon.log`) | | `multica daemon stop` | 发 SIGTERM,优雅关闭(等待进行中的任务完成,超时 30s) | | `multica daemon status` | 打印 daemon 状态、探测到的 agent、watch 中的 workspace | | `multica daemon logs -f` | 实时跟随日志 | | `multica daemon start --profile ` | 启动独立配置的 daemon(用于多环境,比如同时连 staging 和生产) | #### 安全边界 - 每个任务一个**独立工作目录** `~/multica_workspaces/{ws}/{task_short_id}/workdir/` - 环境变量**过滤**:阻止 agent 覆盖 daemon 的认证变量(`MULTICA_TOKEN` 等) - 仓库访问**白名单**:agent 只能 checkout workspace 配置的仓库 - Codex 有**版本相关的 sandbox 策略** #### 产品里的位置 Runtime 是让"给 agent 分配任务"这件事**能真正发生**的基础设施。没有 runtime,所有 agent 就是空壳。用户第一次 onboarding 时必须至少有一个 runtime 在线,否则 agent 没法干活。 #### 对应表 `agent_runtime`, `daemon_token`, `daemon_pairing_session`(弃用中), `daemon_connection`(弃用中), `runtime_usage` --- ### 3.6 Skill 技能 > **角色**:让 agent "学会"某种工作方式的可复用说明文档。 Skill 是一组 Markdown 文档 + 配套文件。它**不是代码**,**不是 prompt 模板**,而是**给 agent CLI 读的说明**。 #### 数据形态 ``` skill ├─ name: "react-patterns" ├─ description: "Common React patterns and best practices" ├─ content: "## Overview\n..." # 主要说明文档 └─ files: ├─ examples/hooks.md └─ examples/useState.jsx ``` #### 它怎么工作 1. **创建**:在 **Settings → Skills** 页面创建或从 URL 导入(如 clawhub.ai、skills.sh) 2. **挂载**:给某个 agent 勾选要用的 skill 3. **注入**:当 agent 认领任务时,daemon 把挂载的 skill 内容写到任务工作目录的 **provider 原生位置**: - Claude Code → `.claude/skills/{name}/SKILL.md` - Codex → `CODEX_HOME/skills/{name}/` - OpenCode → `.opencode/skills/{name}/SKILL.md` - Pi → `.pi/skills/{name}/SKILL.md` - Cursor → `.cursor/skills/{name}/SKILL.md` - GitHub Copilot → `.github/skills/{name}/SKILL.md` - 其他 → `.agent_context/skills/{name}/SKILL.md` 4. **使用**:agent CLI 自己按照 provider 约定发现并读取这些文件 > 💡 **Skill 是静态的**——不是 AI 生成的,也不会随执行变化。它是人写的经验文档。未来可能扩展成"AI 从历史任务中沉淀技能",但当前版本不是。 #### CLI 对应命令 ```bash multica skill list multica skill get multica skill create --title ... multica skill import --url https://... multica skill files upsert --path ... ``` #### 产品里的位置 Skill 是 Multica 区别于"每次都要写长 prompt"的关键机制。它让团队的专业知识**沉淀成可复用的组件**,绑在 agent 上就生效——就像给员工写的 SOP/playbook。 从架构角度:skill 不参与执行逻辑,只参与**上下文注入**。它在整个任务生命周期里只出现一次——在 daemon 启动 CLI 之前的环境准备阶段。 #### 对应表 `skill`, `skill_file`, `agent_skill` --- ### 3.7 Autopilot 自动驾驶 > **角色**:让 agent 在没人触发的时候也能自己开工的调度器。 Autopilot 解决的问题:很多工作是**周期性**的——每天早上的 bug triage、每周的依赖审计、每月的安全扫描。人手动触发太烦,Autopilot 是规则化自动触发。 #### 数据形态 ``` autopilot ├─ title, description ├─ assignee: # 指定哪个 agent 跑 ├─ execution_mode: create_issue | run_only ├─ issue_title_template: "Daily triage - {{date}}" ├─ concurrency_policy: skip | queue | replace └─ triggers (多个): ├─ kind: schedule | webhook | api ├─ cron_expression ├─ timezone └─ webhook_token ``` #### 两种执行模式 - **`create_issue`(默认)**:触发时先创建一个新 issue(标题用 `issue_title_template` 渲染),再把 issue 分配给 agent,走正常 agent 任务流程 - **`run_only`**:直接创建 task,不关联 issue(适合"只执行不留下 ticket"的场景,比如每小时检查某状态) #### 三种触发方式 - **Schedule(cron)**:server 后台每 30 秒扫一次 `autopilot_trigger`,到点的触发出去 - **Webhook**:给出一个带 `webhook_token` 的 URL,外部 POST 即可触发 - **API / Manual**:UI 上点"立即运行"按钮,或用 CLI `multica autopilot trigger ` #### 并发策略 - `skip`:同一个 autopilot 上一次还没跑完,跳过这次(去重) - `queue`:排队等上一次跑完 - `replace`:中止上一次,换成这次 #### 运行记录 每次触发都在 `autopilot_run` 里留一条记录:`pending → issue_created → running → completed/failed/skipped`。在 UI 的 autopilot 详情页可以看全部历史。 #### 内置模板 产品提供一些现成的 autopilot 模板,一键创建: - Daily news digest(每天 9:00) - PR review reminder(工作日 10:00) - Bug triage(工作日 9:00) - Weekly progress report(每周 17:00) - Dependency audit(每周 10:00) - Security scan(每周 02:00) #### 产品里的位置 Autopilot 让 Multica 从"你分配 → agent 做"升级到"agent 自己发起工作"。配合 `run_only` 模式,甚至可以在没有 issue 的前提下跑定时任务。Issue 上的 `origin_type=autopilot` + `origin_id` 字段留下了"这个 issue 是哪个 autopilot run 创建的"的追溯链。 #### 对应表 `autopilot`, `autopilot_trigger`, `autopilot_run` --- ### 3.8 Chat 对话 > **角色**:用户和 agent 的持久多轮对话界面,不依附于 issue。 有时候你不想为了和 agent 说一句话就开一个 issue。Chat 就是为这种"轻量对话"准备的——像 ChatGPT 的对话界面,但是你在和你工作区的某个 agent 对话。 #### 功能 - **创建会话**:选一个 agent 开始 - **消息列表**:支持 Markdown 渲染、代码块高亮 - **发送消息**:消息会被 queue 成一个 task,agent 执行后把响应作为消息写回 - **流式响应**:通过 WebSocket 实时推送 - **未读跟踪**:`unread_since` 字段记录第一条未读消息的时间戳 - **归档**:把旧会话移出活跃列表 - **Session 复用**:同一个 chat session 下的多轮消息会复用底层 CLI 的 `session_id`(Claude Code 能保留对话上下文) #### 和 Issue 评论的区别 | | Chat | Issue 评论 | |---|---|---| | 上下文载体 | 独立 session(chat_session) | 某个 issue | | 是否公开 | 个人和 agent 对话(私有) | 工作区所有成员可见 | | 触发 agent | 每条 user 消息都触发 | 需要 `@agent` | | 用途 | 探索、提问、一次性任务 | 和 issue 强绑定的工作推进 | #### 产品里的位置 Chat 填补了"不够正式到需要开 issue、但又需要持久化"的对话空白。同时也是体验上更像常规聊天软件的入口。 #### 对应表 `chat_session`, `chat_message`;底层执行仍走 `agent_task_queue`(`chat_session_id` 字段区分) --- ### 3.9 Inbox 收件箱与通知 > **角色**:每个人的个人通知中心。 #### 数据形态 `inbox_item` 是推给特定"recipient"的条目: - recipient_type = `member` 或 `agent`(agent 也能有 inbox!) - type(e.g. `issue_assigned`, `comment_mention`, `task_completed`, `invitation_created`) - severity(`action_required` / `attention` / `info`) - 关联的 issue(如果有) - read / archived 状态 #### 通知触发场景 - Issue 被分配给你 - 被 @ 提到 - 订阅的 issue 状态变化 - 订阅的 issue 有新评论 - 工作区邀请 - 你的 agent 任务完成/失败 #### 订阅机制(自动) Server 的 subscriber listener 自动把以下人加入 `issue_subscriber`: - issue creator - 当前 assignee(变更会同步更新) - 评论里被 @ 的人 - 手动订阅的人 #### UI - **Inbox 页面**:两栏布局,左边列表 + 右边 issue 详情 - **批量操作**:全部标记已读 / 仅归档已读 / 归档已完成 issue 的通知 - **徽标**:侧边栏导航上显示未读数 - **WebSocket 推送**:新 inbox 条目实时到达(`inbox:new` 事件只发给目标用户) #### 产品里的位置 Inbox 是"主动注意力系统",让用户不必一直盯着看板也知道哪些事要自己处理。 #### 对应表 `inbox_item`, `issue_subscriber` --- ### 3.10 成员、邀请与权限 #### 角色体系 | 角色 | 权限 | |------|------| | **Owner** | 全部;唯一能删除工作区的角色 | | **Admin** | 管理成员、管理设置;不能删工作区,不能移除其他 admin | | **Member** | 创建 issue、评论、自我分配、使用 agent | #### 邀请流程 - Admin 在 **Settings → Members** 输入邮箱邀请 - Server 生成 `workspace_invitation` 记录(7 天过期) - 发送邮件(Resend 集成,未配置时打到 stderr) - 被邀请人收到邀请:如果已有账号,会出现在个人 Inbox;如果没账号,邮件里有注册链接 - 接受 / 拒绝 / 过期 #### UI - 成员列表:头像、邮箱、角色徽章、操作菜单(改角色、移除) - 待处理邀请列表:可 resend、revoke - Invite 接受页面(`/invite/[id]`):展示工作区信息、接受/拒绝按钮 #### 邀请接受的桌面特殊处理 桌面端的 `multica://invite/{id}` 深链接**不是走路由**,而是触发 `WindowOverlay`——共享视图组件 `InvitePage` 装在原生窗口覆盖层里,保证拖拽移动窗口等原生体验。 #### 产品里的位置 成员管理是**一切协作的前提**。但在 Multica 里它有一个独特之处:成员系统也管 agent。之所以要有 `assignee_type` 区分 member 和 agent,就是为了让两者在同一套 API 里表达"谁可以被分配"。 #### 对应表 `member`, `workspace_invitation` --- ### 3.11 搜索与命令面板 #### 命令面板(Cmd+K) 全局搜索入口,覆盖: - **Issues**(按标题、编号匹配) - **Projects**(按名称匹配) - **Workspaces**(按名称匹配,用于快速切换) - **Navigation**(跳转到设置、runtimes、skills 等) - **Actions**(新建 issue、新建 project、切换主题) - **Recent Issues**(最近访问过的,自动记录) #### 列表过滤 Issue 列表、project 列表、inbox 等都有本地 filter chips 和 search input。 #### 全文搜索 `GET /api/issues/search` 支持对 issue 的标题、描述、评论内容做全文搜索,返回命中片段。 > **当前没有基于向量的语义搜索**——产品宣传是 AI-native,但没有用 pgvector。Schema 里也没启用向量扩展。未来可能扩展。 #### 产品里的位置 Cmd+K 是 keyboard-first 用户(Linear-style)的主要导航方式,比点击侧边栏更快。 --- ### 3.12 认证、登录与 Onboarding #### 登录方式 - **邮箱验证码(Magic Link 风格)**:输入邮箱 → 收 6 位验证码 → 输入验证码登录 - **Google OAuth**:一键 Google 登录 - **PAT(CLI)**:用户在 Settings → API Tokens 里生成的 token,CLI/脚本场景 #### Onboarding 流程(正在重设计中) 位于 `packages/views/onboarding/` 和 `apps/web/app/(auth)/onboarding/`。 经典 5 步: 1. **Welcome** — 欢迎页 2. **Workspace** — 创建工作区(或跳过,如果已有) 3. **Runtime** — 展示可用的 runtime 和 CLI 安装指引 4. **Agent** — 创建第一个 agent(需要有 runtime) 5. **Complete** — 展示创建好的 workspace 和 agent,跳转到 dashboard #### 邀请接受(Zero-workspace) 如果新用户是被邀请进来的(还没有自己的 workspace),接受邀请后直接进入该工作区,跳过 onboarding。 #### 认证后的跳转规则 - 已登录且有至少一个 workspace:跳到 `/{slug}/issues` - 已登录但没有 workspace:进入 `/workspaces/new` 或 onboarding - 未登录:跳到 `/login` #### Signup 限流 Server 支持: - `ALLOW_SIGNUP=false` 关闭注册 - `ALLOWED_EMAILS` / `ALLOWED_EMAIL_DOMAINS` 白名单 #### 产品里的位置 Onboarding 是新用户能不能成功把 agent 跑起来的关键漏斗。任何一步没完成(尤其是 runtime 没连上),后续功能都是空壳。 #### 对应表 `user`, `verification_code`, `personal_access_token` --- ### 3.13 设置与个人资料 #### My Account 标签 - **Profile**:名字、头像(不可上传,系统生成)、邮箱(只读) - **Appearance**:主题(light / dark / system) - **API Tokens**:创建/查看/撤销 PAT;创建时一次性展示完整 token - **Daemon**(桌面独有):本机 daemon 状态、重启、开机自启开关 - **Updates**(桌面独有):当前版本、检查更新、自动更新开关 #### Workspace 标签 - **General**:名字、描述、**Workspace Context**(agent 系统级提示) - **Members**:见 3.10 - **Repositories**:GitHub 集成,连接仓库列表,agent 白名单 - **Agents / Runtimes / Skills / Autopilots**:各自独立页面(实际上这些在侧边栏直接有入口,settings 里也有对应管理 tab) #### 产品里的位置 Settings 是所有"配置即工作"动作的汇总:agent 的 prompt、workspace 的 context、仓库白名单、skill 的内容——都在这里。**对运营和文案来说最重要的一句话**:用户在 Multica 的 settings 页面做的配置,每一项都会影响 agent 实际执行时读到的上下文。 --- ### 3.14 CLI 命令行工具 `multica` 不只是启动 daemon 的工具,也是完整的命令行操作层。很多用户喜欢在终端里推进工作而不是开 UI。 #### 工作区 / 议题 ```bash multica workspace list | get | watch | unwatch multica issue list | get | create | update | assign | status multica issue comment list | add | delete multica issue runs # 查看任务执行历史 multica issue run-messages # 查看某次执行的消息 ``` #### Agent / Skill / Autopilot / Project / Repo ```bash multica agent list | get | create | update | archive multica skill list | get | create | update | delete | import | files upsert multica autopilot list | get | create | update | trigger multica autopilot trigger-add --cron "0 9 * * 1-5" multica project list | get | create | update multica repo list | add | update | delete ``` #### Runtime ```bash multica runtime list | usage | activity | update ``` #### 配置 / 更新 ```bash multica config show | set server_url ... multica auth status | logout multica version | update ``` #### 产品里的位置 CLI 是 Multica 对开发者友好度的体现。对于 agent 自己来说,也同等重要——**agent 在执行任务时能调用 `multica` 命令读写 issue、评论、查文档**,这正是 CLI 在 "agent 作为一等公民"架构里的作用。 --- ## 4. 系统架构全景 ``` ┌─────────────────────┐ ┌────────────────────┐ ┌──────────────────┐ │ Next.js Web App │ │ Electron Desktop │ │ multica CLI │ │ apps/web │ │ apps/desktop │ │ server/cmd/ │ └──────────┬──────────┘ └──────────┬─────────┘ └────────┬─────────┘ │ HTTP + WebSocket │ │ HTTP │ │ │ └──────────────┬────────────────┴───────────────┬───────────┘ │ │ ▼ ▼ ┌─────────────────────────────────────────────────┐ │ Go Backend (server/) │ │ • Chi HTTP router • gorilla/websocket hub │ │ • sqlc generated queries │ │ • In-process event bus │ │ • Background workers (sweeper / scheduler) │ └──────────────────┬──────────────────────────────┘ │ ▼ ┌──────────────────────┐ │ PostgreSQL 17 │ │ + pgcrypto │ │ (28 tables) │ └──────────────────────┘ ▲ │ HTTPS poll + heartbeat │ ┌─────────────────────────────────────────────────┐ │ Local Daemon (用户机器上运行) │ │ • 每 3s 认领任务 • 每 15s 心跳 │ │ • 探测并启动 agent CLI 子进程 │ │ • 为任务准备隔离工作目录 │ └───────────────┬─────────────────────────────────┘ │ spawns ┌───────────────┼─────────────────────────────────┐ ▼ ▼ ▼ ▼ Claude Code Codex OpenCode …其他 CLI (子进程) (子进程) (子进程) ``` ### 分层职责 | 层 | 负责什么 | 不负责什么 | |---|---|---| | **Web / Desktop 客户端** | UI、本地客户端状态(Zustand)、服务器状态缓存(TanStack Query)、WebSocket 订阅 | 业务规则、AI 调用 | | **Server** | 持久化、权限、任务编排、事件广播、Autopilot 调度、Runtime 健康监测 | 不直接执行 agent、不调 LLM | | **Daemon** | 探测并启动本地 CLI、管理任务工作目录、流式上报消息、session 恢复 | 不做业务决策、只认 server 给它的任务 | | **Agent CLI(Claude Code 等)** | 实际调用 LLM、执行工具调用、写文件、跑测试 | 不感知 Multica 的数据模型(所有上下文通过 `multica` CLI 命令读回) | ### 实时层(WebSocket) Server 启动一个 WebSocket hub: - **鉴权**:URL 参数里的 JWT 或 PAT + workspace_slug - **房间模型**:按 workspace 分房间,一个 workspace 的事件只广播给该房间的连接 - **个人定向推送**:`inbox:new`, `invitation:created` 等个人事件用 `SendToUser` - **心跳**:server 每 54 秒 ping,客户端 60 秒内必须 pong **全部事件类型(供文案参考,共约 60+ 个)**: - `issue:created` / `issue:updated` / `issue:deleted` - `comment:created` / `comment:updated` / `comment:deleted` / `reaction:added` / `issue_reaction:added` - `agent:created` / `agent:status` / `agent:archived` - `task:dispatch` / `task:progress` / `task:message` / `task:completed` / `task:failed` / `task:cancelled` - `inbox:new` / `inbox:read` / `inbox:archived` / `inbox:batch-*` - `workspace:updated` / `workspace:deleted` / `member:added` / `member:updated` / `member:removed` - `invitation:created` / `invitation:accepted` / `invitation:declined` / `invitation:revoked` - `chat:message` / `chat:done` / `chat:session_read` - `skill:created` / `skill:updated` / `skill:deleted` - `project:created` / `project:updated` / `project:deleted` - `autopilot:created` / `autopilot:updated` / `autopilot:run_start` / `autopilot:run_done` - `subscriber:added` / `activity:created` - `daemon:heartbeat` / `daemon:register` 客户端收到事件后的模式:要么直接 patch 本地缓存(issue / comment / task 这类需要即时更新的),要么触发对应 query 的失效重拉(less-critical 数据)。 ### AI / LLM 在哪里 **Multica 本身不直接调 LLM API**。所有 LLM 调用都在 agent CLI 子进程里发生(Claude Code 调 Anthropic API、Codex 调 OpenAI API 等)。 Server 和 daemon 做的事情是: 1. 准备 prompt(见 `server/internal/daemon/prompt.go`) 2. 准备环境变量(agent.custom_env 注入) 3. 准备工作目录(注入 CLAUDE.md / AGENTS.md / skills / issue context) 4. 启动 CLI 子进程 5. 流式读 CLI 的 stdout,把消息分类并转发 **所以看不到大段的 prompt 工程代码**——prompt 只有几个模板(task prompt、chat prompt、comment-triggered prompt),核心内容是 agent instructions + issue context + skill files,真正的 LLM 对话由 CLI 自己管理。 ### 后台任务 Server 启动三个 goroutine: 1. **Runtime Sweeper**(每 30s):标记离线 runtime、回收孤儿任务、GC 长期离线 runtime 2. **Autopilot Scheduler**(每 30s):扫 cron 触发器,到点就 dispatch 3. **DB Stats Logger**:周期性打印 pgxpool 连接池状态 --- ## 5. 产品地图(全部路由) ### 公共 / 认证 - `/` — 首页 - `/login` — 登录 - `/auth/callback` — OAuth 回调 - `/workspaces/new` — 创建工作区 - `/invite/[id]` — 接受邀请 - `/onboarding` — 首次引导 ### 工作区内(`/{slug}/...`) - `/issues` — Issue 列表(board / list 视图) - `/issues/[id]` — Issue 详情 - `/my-issues` — 我的 issue(三 scope) - `/projects` — 项目列表 - `/projects/[id]` — 项目详情 - `/autopilots` — Autopilot 列表 - `/autopilots/[id]` — Autopilot 详情 - `/agents` — Agent 列表 - `/runtimes` — Runtime 列表 - `/skills` — Skill 库 - `/inbox` — 收件箱 - `/settings` — 设置(包含多个 tab:profile / appearance / tokens / workspace / members / repos / daemon / updates) ### 桌面端特有(不是路由,是 WindowOverlay) - **Create workspace overlay** - **Invite accept overlay**(来自 `multica://invite/{id}` 深链接) - **Onboarding overlay**(首次或零工作区时) --- ## 6. 跨平台差异:Web vs 桌面 ### 共享(绝大部分功能) 所有业务页面(issues / projects / autopilots / agents / runtimes / skills / inbox / settings / chat / login / onboarding)的实际 UI 都在 `packages/views/` 里,web 和桌面共用同一套组件。 ### Web 特有 - 地址栏 + 浏览器前进后退 - 服务端渲染(SSR) - `/login` 的 OAuth 回调处理 localhost 端口(方便 CLI 登录) ### 桌面特有 - **多标签**:每个 workspace 独立标签组,可以拖拽重排 - **WindowOverlay**:邀请接受、创建工作区、onboarding 不走路由,而是原生窗口层 - **Daemon 集成**:设置里能直接重启本机 daemon、看状态 - **本地 daemon runtime 卡片**:在 Runtimes 页面自动显示本机 daemon - **自动更新**:`Settings → Updates` 检查/下载/安装新版本 - **Immersive mode**:全屏模式,隐藏侧边栏 - **深链接**:`multica://auth/callback?token=...` 和 `multica://invite/{id}` - **拖动区**:macOS 的红绿灯 + 顶部 48px 拖拽条(`h-12`)用来移动窗口 - **Workspace 单例守护**:`setCurrentWorkspace()` 管理当前活跃工作区的全局身份 ### 为什么两端要做差异 Web 有 URL 栏——错误状态(比如"你没有访问这个 workspace 的权限")作为一个可分享的 URL 页面是有意义的。桌面没有 URL 栏——同样的状态只会把用户困住,所以桌面选择**静默自愈**:把失效的 tab 从 store 里移除即可。这个差异直接影响多个细节: - Web 有 `NoAccessPage`,桌面没有 - Web 有 `/workspaces/new` 页面,桌面把它做成 overlay - Web 的 deep link 直接路由,桌面的深链接转 WindowOverlay --- ## 7. 附录:关键数据表速查 共 **28 张表**,覆盖 10 个产品域。以下按域列出最重要的字段,供文案/产品查询"某个功能背后到底存了什么"。 ### 身份 / 认证 - `user` — 基础账号(id, email, name, avatar_url) - `verification_code` — 邮箱验证码(code, expires_at, attempts) - `personal_access_token` — 用户 API token(token_hash, token_prefix, revoked) ### 工作区 / 成员 - `workspace` — 容器(name, slug, description, context, settings, repos, issue_prefix, issue_counter) - `member` — 成员身份(role: owner/admin/member) - `workspace_invitation` — 邀请(invitee_email, status: pending/accepted/declined/expired) ### Agent / Runtime / Skill - `agent` — Agent 主表(instructions, custom_env, custom_args, mcp_config, runtime_mode, visibility, status) - `agent_runtime` — 运行时(daemon_id, provider, status: online/offline, last_seen_at) - `agent_skill` — agent 挂载 skill 的 n-n 关联 - `skill` — 技能主文档(name, description, content) - `skill_file` — 技能附带文件(path, content) - `daemon_token` — 守护进程级 token - `daemon_connection` / `daemon_pairing_session` — 早期设计(弃用中) ### Issue / 协作 - `issue` — 议题(status, priority, assignee_type+assignee_id, creator_type+creator_id, parent_issue_id, project_id, origin_type, origin_id, acceptance_criteria, due_date, position) - `issue_label` / `issue_to_label` — 标签 - `issue_dependency` — 依赖关系(blocks / blocked_by / related) - `issue_subscriber` — 订阅者(reason: creator/assignee/commenter/mentioned/manual) - `issue_reaction` / `comment_reaction` — emoji 反应 - `comment` — 评论(type: comment/status_change/progress_update/system, parent_id for threading) - `attachment` — 附件 ### 任务执行 - `agent_task_queue` — 任务主表(status: queued/dispatched/running/completed/failed/cancelled, context, result, session_id, work_dir, trigger_comment_id, chat_session_id, autopilot_run_id) - `task_message` — 每次执行的消息流水(seq, type, tool, input, output) - `task_usage` — Token 用量(input/output/cache_read/cache_write tokens) ### 对话 - `chat_session` — 聊天会话(unread_since, session_id, work_dir) - `chat_message` — 消息(role: user/assistant) ### 项目与组织 - `project` — 项目(status, priority, lead_type+lead_id, icon) - `pinned_item` — 侧边栏置顶(item_type, item_id, position) ### 自动化 - `autopilot` — 规则(assignee_id, execution_mode: create_issue/run_only, issue_title_template, concurrency_policy) - `autopilot_trigger` — 触发器(kind: schedule/webhook/api, cron_expression, timezone, next_run_at, webhook_token) - `autopilot_run` — 执行记录(status: pending/issue_created/running/skipped/completed/failed) ### 通知与审计 - `inbox_item` — 收件箱条目(recipient_type, type, severity, read, archived) - `activity_log` — 审计日志(actor_type: member/agent/system, action, details) - `runtime_usage` — 运行时按日聚合 token 用量(给计费/容量规划用) --- ## 尾声 Multica 的设计可以归结为一句话:**把"人在一个看板上协作"这件事,扩展到了"人 + AI agent 在同一个看板上协作"**。 所有功能都是围绕这个核心展开: - 为了让 agent 能像人一样被分配任务 → polymorphic actor(`assignee_type`) - 为了让 agent 能自己开工 → Autopilot - 为了让 agent 的工作方式能沉淀复用 → Skill - 为了让 agent 执行在用户控制的环境里 → Runtime + Daemon - 为了让人不被通知淹没 → Inbox + 自动订阅 - 为了让一次会话有连续性 → Session Resumption 当你读到某段文案、某个 UI 模块、某张表时,请把它放回这个"人 + AI 协作"的坐标系里去理解它的位置。