feat(ai-kb): 系统应用知识库迁出核心库,改由应用自带

主程序核心 RAG 知识库不再内置系统应用文档,改由各应用安装时自带并同步到 overlay。

- 删除 approve/okr/minder/drawio/office/fileview/search/ai-assistant 等系统应用共 125 个核心 chunk
- _meta/feature-map.yaml 移除已迁出 feature 块;tool-binding.yaml 清理失效 feature 引用
- 13 个保留文件的跨库死链 [[xref]] 降级为纯文本
- docker/appstore/.gitignore 忽略应用 KB overlay 目录(ai-kb/*,保留 .gitkeep)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
kuaifan 2026-06-18 22:07:07 +00:00
parent aa872773f5
commit 97718bc22a
142 changed files with 26 additions and 7365 deletions

View File

@ -2,4 +2,5 @@ apps/*
config/*
log/*
temp/*
ai-kb/*
!.gitkeep

View File

View File

@ -273,36 +273,6 @@ features:
- report.analysis.concept
- report.permission.faq
- id: approve
name: 审批
scope: end-user
batch: B2
priority: P0
chunk_count_est: 20
owner: ~
status: drafted
chunks:
- approve.plugin.concept
- approve.install.howto
- approve.template.concept
- approve.template.howto
- approve.node.concept
- approve.form.concept
- approve.delete.howto
- approve.export.howto
- approve.entry.menu-map
- approve.concept
- approve.start.howto
- approve.my-start.howto
- approve.my-todo.howto
- approve.doto.howto
- approve.cc.howto
- approve.detail.howto
- approve.process-inst.concept
- approve.history.concept
- approve.notify.concept
- approve.comment.howto
- id: checkin
name: 签到打卡
scope: end-user
@ -316,40 +286,15 @@ features:
- checkin.concept
- checkin.regular.howto
- checkin.wifi.howto
- checkin.face.howto
- checkin.face.concept
- checkin.record.howto
- checkin.remind.concept
- checkin.setting.howto
- checkin.rule.concept
- checkin.export.howto
- checkin.late.faq
- checkin.face-fail.faq
- checkin.mac-not-match.faq
- checkin.plugin.concept
- id: okr
name: OKR
scope: end-user
batch: B2
priority: P1
chunk_count_est: 12
owner: ~
status: drafted
chunks:
- okr.entry.menu-map
- okr.concept
- okr.plugin.concept
- okr.objective.concept
- okr.kr.concept
- okr.create.howto
- okr.update-progress.howto
- okr.cycle.concept
- okr.align.howto
- okr.review.howto
- okr.team.concept
- okr.cannot-install.faq
# ===== A5. 应用中心(系统应用 + 管理员应用 + 微应用) (B3) =====
- id: app-system
name: 内置系统应用11 个,含审批/签到/报告/收藏/最近/机器人/创建群/会议/创建项目/添加任务/导出)
@ -415,94 +360,6 @@ features:
- micro-app.uninstall.howto
- micro-app.entry.menu-map
- id: minder
name: 思维导图minder 插件)
scope: end-user
batch: B3
priority: P1
chunk_count_est: 5
owner: ~
status: drafted
chunks:
- minder.collaboration.concept
- minder.concept
- minder.plugin.concept
- minder.create.howto
- minder.entry.menu-map
- id: drawio
name: 流程图drawio 插件)
scope: end-user
batch: B3
priority: P1
chunk_count_est: 5
owner: ~
status: drafted
chunks:
- drawio.concept
- drawio.plugin.concept
- drawio.template.concept
- drawio.create.howto
- drawio.entry.menu-map
- id: office
name: OnlyOffice 在线文档office 插件)
scope: end-user
batch: B3
priority: P1
chunk_count_est: 5
owner: ~
status: drafted
chunks:
- office.collaboration.concept
- office.concept
- office.plugin.concept
- office.create.howto
- office.entry.menu-map
- id: fileview
name: 文件预览fileview 插件)
scope: end-user
batch: B3
priority: P2
chunk_count_est: 3
owner: ~
status: drafted
chunks:
- fileview.concept
- fileview.plugin.concept
- fileview.supported.concept
- id: memos
name: Memos 笔记memos 插件)
scope: end-user
batch: B3
priority: P1
chunk_count_est: 5
owner: ~
status: drafted
chunks:
- memos.concept
- memos.plugin.concept
- memos.tag.concept
- memos.create.howto
- memos.entry.menu-map
- id: kpi
name: KPI 绩效kpi 插件)
scope: end-user
batch: B3
priority: P1
chunk_count_est: 5
owner: ~
status: drafted
chunks:
- kpi.concept
- kpi.plugin.concept
- kpi.scoring.concept
- kpi.create.howto
- kpi.entry.menu-map
# ===== F. 通信通知 (B3) =====
- id: email-notice
name: 邮件通知
@ -806,90 +663,6 @@ features:
- appstore.update.howto
- appstore.entry.menu-map
# ===== D. AI 助手 (B5) =====
- id: ai-assistant
name: AI 助手(入口/模型/对话/工具/任务集成)
scope: end-user
batch: B5
priority: P0
chunk_count_est: 48
owner: ~
status: drafted
chunks:
- ai-assistant.entry.howto
- ai-assistant.auth.concept
- ai-assistant.close.howto
- ai-assistant.create-task.howto
- ai-assistant.disabled.faq
- ai-assistant.element-action.howto
- ai-assistant.embed-entry.concept
- ai-assistant.feedback.howto
- ai-assistant.float-button.concept
- ai-assistant.float-button.howto
- ai-assistant.guide.concept
- ai-assistant.image-upload.howto
- ai-assistant.intelligent-search.howto
- ai-assistant.list-tasks.howto
- ai-assistant.match-elements.concept
- ai-assistant.mcp-down.faq
- ai-assistant.mobile-entry.concept
- ai-assistant.modal.concept
- ai-assistant.model-empty.faq
- ai-assistant.model-switch.howto
- ai-assistant.model.concept
- ai-assistant.multimodal.concept
- ai-assistant.new-chat.howto
- ai-assistant.no-tool-call.faq
- ai-assistant.page-action.concept
- ai-assistant.page-action.howto
- ai-assistant.page-context-tool.concept
- ai-assistant.page-context.concept
- ai-assistant.privacy.concept
- ai-assistant.project-init.howto
- ai-assistant.report-draft.howto
- ai-assistant.search-files.howto
- ai-assistant.search-help-docs.howto
- ai-assistant.search-users.howto
- ai-assistant.send-message.howto
- ai-assistant.session-delete.howto
- ai-assistant.session-list.howto
- ai-assistant.session-save.howto
- ai-assistant.session.concept
- ai-assistant.shortcut.howto
- ai-assistant.start-guide.howto
- ai-assistant.stop.howto
- ai-assistant.streaming.concept
- ai-assistant.subtask-suggest.howto
- ai-assistant.task-mention.howto
- ai-assistant.task-summary.howto
- ai-assistant.tool-call.concept
- ai-assistant.tool-failed.faq
- ai-assistant.tool-permission.faq
- ai-assistant.tools-list.concept
- ai-assistant.tools.concept
- ai-assistant.welcome-prompts.concept
# ===== G. 搜索 (B5) =====
- id: search
name: 全局搜索Manticore
scope: end-user
batch: B5
priority: P0
chunk_count_est: 10
owner: ~
status: drafted
chunks:
- search.concept
- search.contact.howto
- search.engine.concept
- search.entry.menu-map
- search.file.howto
- search.intelligent.concept
- search.message.howto
- search.no-result.faq
- search.project.howto
- search.task.howto
# ===== I. 终端 (B5) =====
- id: web-client
name: Web 端

View File

@ -25,7 +25,7 @@ tools:
search_users:
description: 按关键词搜索用户,支持按项目/对话范围筛选
related_features: [user-account, search]
related_features: [user-account]
typical_chunk_types: [howto]
# ===== 任务 =====
@ -93,7 +93,7 @@ tools:
# ===== 消息 / 对话 =====
search_dialogs:
description: 搜索群聊或个人对话
related_features: [messenger, search]
related_features: [messenger]
typical_chunk_types: [howto]
send_message:
@ -103,7 +103,7 @@ tools:
send_task_ai_message:
description: 作为 AI 助手向任务对话发送消息
related_features: [messenger, task, ai-assistant]
related_features: [messenger, task]
typical_chunk_types: [howto]
get_message_list:
@ -119,7 +119,7 @@ tools:
search_files:
description: 搜索文件
related_features: [file, search]
related_features: [file]
typical_chunk_types: [howto]
get_file_detail:
@ -145,7 +145,7 @@ tools:
generate_report_template:
description: 基于任务完成情况自动生成报告模板
related_features: [report, ai-assistant]
related_features: [report]
typical_chunk_types: [howto]
create_report:
@ -166,7 +166,7 @@ tools:
# ===== 搜索 =====
intelligent_search:
description: 统一搜索(任务/项目/文件/联系人/消息),支持语义搜索
related_features: [search]
related_features: []
typical_chunk_types: [howto, concept]
# 注图片文字提取OCR / 原 extract_image_text已下线改由多模态模型直接理解图片
@ -182,10 +182,10 @@ tools:
# ===== 内置工具AI 插件 helper/tools.py=====
get_session_image:
description: 获取用户上传的会话图片(多模态用)
related_features: [ai-assistant, file]
related_features: [file]
typical_chunk_types: [howto]
search_help_docs:
description: 本知识库自身的检索工具;当用户询问 DooTask 功能用法/概念/操作步骤时调用
related_features: [ai-assistant]
related_features: []
typical_chunk_types: [howto]

View File

@ -1,64 +0,0 @@
---
id: ai-assistant.auth.concept
title: AI 助手鉴权stream_key
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 鉴权
- AI 授权
- stream_key
- AI token
- AI 流凭证
related_tools: []
related_pages: []
prerequisites:
- 用户已登录
- 当前用户允许聊天
negative:
- stream_key 是一次性凭证,发完一条消息就失效
- 流式接口 /ai/invoke/stream/* 不在主仓库,由 dootask-ai 容器提供
- 普通用户不需要关心 stream_key前端自动获取
last_verified: v1.7.90
---
# AI 助手鉴权stream_key
## 定义
AI 助手发送提问前必须先调用 `POST api/assistant/auth` 生成一次性 `stream_key`,再用它去开 SSE 流(`/ai/invoke/stream/{stream_key}`),既复用登录态又避免把用户 token 暴露给 ai 容器。
## 数据流
1. 用户点发送
2. 前端 `POST api/assistant/auth`,参数:`model_type``model_name``context`JSON`locale`zh/en缺省取请求语言语言包含 zh 视为 zh否则 en
3. 后端 `AssistantController::auth` 校验登录 + 聊天权限,写入临时凭证
4. 返回 `{stream_key: "xxx"}`
5. 前端开 SSE`ai/invoke/stream/{stream_key}`
6. ai 容器消费凭证、转发上游模型,推回 `append/replace/done`
## 关键约束
- **一次性**:一个 stream_key 仅能开一次 SSE 流
- **绑定用户**:内嵌 `userid`,越权使用被拒
- **携带 context**:对话历史在 auth 阶段写入ai 容器不反向查 DooTask 库
- **插件校验**`AssistantController` 构造函数先做 `Apps::isInstalledThrow('ai')`;未装直接抛错
## 权限校验
`User::auth()->checkChatInformation()`:未登录 / 被禁止聊天 / 激活异常都会拒绝。
## 相关接口
| 接口 | 用途 |
|---|---|
| `POST api/assistant/auth` | 生成 stream_key |
| `GET api/assistant/models` | 拉可用模型列表 |
| `POST api/assistant/session/list` | 历史会话 |
| `POST api/assistant/session/save` | 保存当前会话 |
| `POST api/assistant/session/delete` | 删除 / 清空 |
## 不支持
- 不支持复用 stream_key
- 不支持匿名调用
- 不支持终端用户直接管理 token
## 相关
- [[ai-assistant.privacy.concept]]
- [[ai-assistant.streaming.concept]]

View File

@ -1,61 +0,0 @@
---
id: ai-assistant.embed-entry.concept
title: 业务嵌入式 AI 入口
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 嵌入业务
- 任务里 AI
- 项目 AI 生成
- 工作报告 AI
- 消息里 AI
- AI 业务入口
related_tools: []
related_pages: [task_detail, project_create, report_edit, dialog]
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已配置至少一个 AI 模型
negative:
- 嵌入式入口与浮窗对话不共用同一会话池(按 sessionKey 隔离)
- 嵌入入口大多有自定义 system 提示词,输出格式可能强约束(如 JSON
- 不是所有页面都有 AI 按钮,只有这里列出的业务场景才内嵌
last_verified: v1.7.90
---
# 业务嵌入式 AI 入口
## 定义
除浮按钮和快捷键外DooTask 在多个业务表单内嵌入了「上下文相关」的 AI 入口。它们与全局浮窗调的是同一个 AI 助手组件,但通过 `sessionKey` + `onBeforeSend` + `onApply` 等参数定制行为,让 AI 直接产出可应用到表单的结构化内容。
## 已知嵌入入口
| 入口 | 触发位置 | sessionKey | 典型用途 |
|---|---|---|---|
| 项目创建 | 新建项目弹窗 AI 按钮 | `project-create` | 生成项目名 + 看板列 |
| 任务创建 | 添加任务弹窗 AI 按钮 | `task-add` | 生成任务标题 / 描述 / 子任务 |
| 工作汇报 | 汇报编辑器 AI 工具 | `report-edit` | 基于近期任务生成草稿 |
| 消息输入 | 群 / 私聊输入栏 AI 图标 | `chat-message` | 帮你写消息草稿 |
| 任务讨论 | 任务详情 @AI | — | 机器人方式触发 |
## 与浮窗的区别
- **会话池隔离**:不同 `sessionKey` 走不同桶;项目创建会话不会和任务创建混在一起
- **上下文重建**:嵌入入口通过 `onBeforeSend` 重写 context不走默认助手 system 提示)
- **应用按钮**:回答下方有「应用此内容」按钮,自动回填原表单
- **加载提示**:可自定义「正在生成项目结构…」之类提示
## 应用此内容
回答完成后弹出 `Button`
1. 点击触发 `onApply` 回调
2. 解析 AI 输出(通常 JSON并填入原表单
3. 应用成功后嵌入弹窗自动关闭
## 不支持
- 嵌入会话不出现在浮窗历史下拉里
- 不能在嵌入入口切回浮窗系统提示词
- 没有 AI 按钮的页面(日历 / 文件 / 个人设置)不能内嵌唤起
## 相关
- [[ai-assistant.entry.howto]]
- [[ai-assistant.session.concept]]

View File

@ -1,51 +0,0 @@
---
id: ai-assistant.float-button.concept
title: AI 助手浮按钮
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 浮窗按钮
- AI 浮窗
- AI 浮窗怎么用
- 屏幕角落的 AI 球
- AI 小球
- 那个小气泡
- 浮动按钮
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已在系统设置「AI 模型」中配置至少一个模型
negative:
- 浮按钮位置只保留水平/垂直两个距离,不存绝对坐标,换屏分辨率不会跑出屏外
- 收起状态下点击直接打开 AI 助手,不会再触发拖动
- 拖动 ≥ 5px 或按下 ≥ 200ms 算拖动;小于该阈值才视为点击
last_verified: v1.7.90
---
# AI 助手浮按钮
## 定义
浮按钮是 DooTask 桌面端 / 移动端常驻在屏幕角落的圆形 AI 入口44px 直径,点击呼出 AI 助手浮窗或弹窗。它独立挂在 `<body>` 上,与当前路由解耦,**任何登录后页面都能看到**(登录页除外)。
## 关键属性
- **位置存储**:只保存两个距离(距左 / 距右 + 距上 / 距下)和「贴边收起」状态,写入 IndexedDB key `aiAssistant.floatButtonPosition`
- **默认位置**:桌面端右下角(距右 24px、距底 100px移动端竖屏靠右、距底约 1/4 屏高
- **可拖动**:桌面端鼠标按住拖动;移动端单指触摸拖动
- **贴边收起**:靠近左 / 右屏幕边缘 ≤ 12px 时延迟自动收起为竖条(桌面端 1 秒、移动端 5 秒)
- **收起态再点开**:收起状态下点按钮直接打开 AI 助手,不会再拖动
## 显示条件
- 已安装 ai 插件(`microAppsIds` 包含 `ai`
- 已登录(`userId > 0`
- 当前不在登录页
- AI 助手弹窗未打开时
## 与浮窗的关系
浮按钮只是「入口」,点击触发 `openAIAssistantGlobal` 事件。真正的对话窗口由 [[ai-assistant.modal.concept]] 渲染。
## 不支持
- 不支持双击 / 长按弹出菜单(除了移动端长按用于拖动)
- 不支持把浮按钮完全隐藏后再用快捷键恢复——隐藏需在「个人设置」关闭(详见 [[ai-assistant.float-button.howto]]

View File

@ -1,41 +0,0 @@
---
id: ai-assistant.guide.concept
title: 什么是页面深链(带我去)
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 操作引导
- 带我去
- 带我操作
- 页面深链
- 快捷跳转
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 深链只负责把你送到对应页面/面板,不会自动帮你点击页面内的具体按钮或开关
- 需要运行时定位的目标(某条具体任务/对话)不通过深链,由 AI 直接帮你打开
last_verified: v1.7.90
---
# 什么是页面深链(带我去)
## 这是什么
当你问 AI「X 在哪里设置 / 怎么去 X」时AI 的回答里会把可定位的页面或面板(如「系统设置」「个人设置」「日历」)渲染成**蓝色可点击的链接**。点一下就**直接跳转到那一屏**,省去自己翻菜单。
## 怎么用
- 在 AI 助手浮窗里问操作类/“在哪”类问题
- 回答正文里出现蓝色链接词点击即跳转AI 浮窗会自动收起,避免遮挡)
- 到达目标页后,按回答里的文字说明完成剩下的操作
## 边界
- 深链把你送到**正确的页面/面板**;页面内具体那一行开关/按钮在哪,需要你按说明自己看一眼
- 不是每个名词都可点:只有命中系统内已登记目的地的词才会变成链接,其余按普通文字显示
- 打开某条具体任务/对话(需要具体 ID不走深链AI 会直接帮你打开
## 相关
- 如何使用:[[ai-assistant.start-guide.howto]]
- AI 操作页面的底层能力:[[ai-assistant.page-action.concept]]

View File

@ -1,56 +0,0 @@
---
id: ai-assistant.match-elements.concept
title: AI 怎么找到页面元素
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- match_elements
- AI 找按钮
- 元素匹配
- 向量匹配元素
- AI 怎么知道点哪
- AI 元素识别
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 匹配纯依赖元素可见文本/aria-label/title无文本的图标按钮命中率低
- 单次匹配上限 50 个候选元素
- 不持久化匹配结果,每轮交互需重新取上下文
last_verified: v1.7.90
---
# AI 怎么找到页面元素
## 定义
当 AI 想操作页面元素(点按钮、填表)时,先采集当前页面上下文拿到候选元素列表(每条含 ref / name / role再通过后端 API `POST api/assistant/match-elements` 把"用户意图描述"和"候选列表"提交给 embedding 服务,返回按余弦相似度排序的命中元素。
## 工作流
1. **采集**:前端按 ARIA 角色扫描,给每个可交互元素分配 refe1, e2...)和 name
2. **关键词过滤**:先用 query 做子串匹配
3. **向量匹配**:关键词没命中时对 query 和元素 name 求 embedding取相似度 top-K默认 10最多 50
4. **执行**:模型拿匹配元素的 ref让 AI 助手在你的页面上操作该元素
## 元素信息字段
- `ref`本轮唯一标识e1, e2...
- `name`:可见文本 / aria-label / title
- `role`ARIA 角色button / textbox / link 等)
- `selector` + `nth`:兜底选择器
## 命中率
- 有清晰文本的按钮:高
- 仅 icon 无 aria-label建议加 title
- 隐藏元素:默认不采集
## 不支持
- 元素匹配仅基于元素文本,不靠图像识别
- 不支持「按位置」找元素("左上角第三个"
- 不能跨 iframe 匹配
## 相关
- 取页面上下文:[[ai-assistant.page-context-tool.concept]]
- 操作元素:[[ai-assistant.element-action.howto]]
- 页面操作机制:[[ai-assistant.page-action.concept]]

View File

@ -1,63 +0,0 @@
---
id: ai-assistant.mobile-entry.concept
title: 移动端 AI 助手入口
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 手机上怎么用 AI
- 移动端 AI 入口
- 手机 AI 助手
- 移动端 AI 浮球
- 手机 AI 弹窗
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已配置至少一个 AI 模型
negative:
- 移动端没有键盘快捷键
- 浮按钮位置不在桌面 / 移动间同步
- AI 弹窗在移动端走全屏,不能调整大小
last_verified: v1.7.90
---
# 移动端 AI 助手入口
## 定义
移动端指通过 iOS / Android App 或手机浏览器访问 DooTask`isMobile = true`含竖横屏窄屏。AI 助手在移动端有两类入口:**浮按钮小球** 和 **业务页面内嵌按钮**
## 浮按钮(主入口)
- 屏幕右侧默认距底约 1/4 屏高悬浮
- 加载后自动收起为屏幕边缘 48px 高竖条
- 单指按住可拖动到任何位置;松开后靠近左右边缘会再次自动收起
- 单击展开 AI 助手;展开后**全屏**弹窗,覆盖整个视口
## 全屏对话
- 移动端 AI 弹窗强制全屏(`is-mobile-fullscreen`
- 顶部有标题栏 + 关闭按钮 + 历史会话下拉
- 不能调整大小、不能拖动窗口
## 业务嵌入入口
- 任务详情底部输入区 AI 图标
- 工作汇报编辑器工具栏「AI 生成」
- 消息会话群里 @AI
- 创建项目名右侧 AI 按钮
## 与桌面端的差异
| 维度 | 桌面端 | 移动端 |
|---|---|---|
| 弹窗形态 | 浮窗或 modal | 全屏 modal |
| 浮按钮自动收起延迟 | 1 秒 | 5 秒(加载即收起) |
| 快捷键 | Cmd/Ctrl + I | 无 |
| 默认浮按钮位置 | 右下距底 100px | 右侧距底 1/4 屏高 |
## 不支持
- 不支持移动端快捷收起 / 展开浮按钮(必须靠拖动)
- 不支持移动端关闭浮按钮本身
- 不支持移动端浮窗与桌面浮窗位置同步
## 相关
- [[ai-assistant.float-button.concept]]
- [[ai-assistant.modal.concept]]

View File

@ -1,68 +0,0 @@
---
id: ai-assistant.modal.concept
title: AI 助手弹窗形态
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 浮窗
- AI 弹窗
- AI 全屏
- AI 窗口
- AI 模态框
related_tools: []
related_pages: []
prerequisites: []
negative:
- 移动端浮窗一律全屏,不能调整大小
- 桌面端浮窗最小 380×400最大 800×900
- 弹窗 z-index 每 5/20 秒自动调高确保覆盖其他模态
last_verified: v1.7.90
---
# AI 助手弹窗形态
## 定义
AI 助手有两种渲染形态,由打开时的 `displayMode` 决定:
- `chat`**浮窗**(默认,可拖动 / 调整大小 / 桌面右下角)
- `modal`**居中模态**(默认 600px 宽,移动端自动全屏)
## chat 浮窗(桌面端默认)
- 通过 `v-transfer-dom` 挂到 `<body>`,避免被父容器裁切
- 自带 8 个 resize 控制点(四边 + 四角),可拖拽改大小
- 标题栏可拖动整窗,双击切换全屏
- 位置 / 尺寸记忆到 IndexedDB`aiAssistant.chatPosition` / `aiAssistant.chatSize`
## 尺寸约束chat 浮窗)
| 维度 | 最小 | 最大 | 默认 |
|---|---|---|---|
| 宽度 | 380 | 800 | 460 |
| 高度 | 400 | 900 | 600 |
## modal 模态(业务嵌入入口默认)
- iView `Modal` 组件渲染,居中遮罩
- 宽度:新建会话 440已有对话 600
- 桌面端遮罩点击**不**关闭(`mask-closable: false`
- 移动端强制全屏
## 移动端
- 不论 displayMode 是什么都全屏
- 顶部有标题栏、关闭、历史下拉
- 关闭按钮 `Icon type="ios-close"` 位于右上
- 输入区固定在底部
## z-index 自适应
- 初始 `topZIndex = max(modalTransferIndex, 1000) + 1000`
- 弹窗打开期间每 5 秒重新评估(高于新模态)
- 关闭后每 20 秒评估
## 不支持
- 不支持最小化为小球(要小球用浮按钮)
- 不支持多窗口同时打开多个对话
- 不支持自定义 z-index
## 相关
- [[ai-assistant.float-button.concept]]
- [[ai-assistant.close.howto]]
- [[ai-assistant.mobile-entry.concept]]

View File

@ -1,68 +0,0 @@
---
id: ai-assistant.model.concept
title: AI 助手可用模型
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 模型
- 可以选哪些 AI
- DooTask AI 模型
- GPT Claude DeepSeek
- AI 服务商
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已在系统设置「AI 模型」中配置至少一个模型的 API Key
negative:
- 终端用户不能自己加模型 / 改 API Key必须由管理员配置
- 没有「免费内置模型」DooTask 不自带 API Key
- 模型下拉为空 = 管理员未配 / 未启用任何模型
last_verified: v1.7.90
---
# AI 助手可用模型
## 定义
AI 助手在浮窗底部下拉框展示的「可选模型」,全部来自管理员在系统设置 →「AI 模型」中配置并启用的服务商。前端通过 `GET api/assistant/models` 拉当前生效配置,按服务商分组渲染。
## 支持的服务商分组
`AIBotMap` 顺序展示(每组最多前 5 个模型 + 默认模型):
| key | 显示名 |
|---|---|
| `openai` | ChatGPT |
| `claude` | Claude |
| `deepseek` | DeepSeek |
| `gemini` | Gemini |
| `grok` | Grok |
| `ollama` | Ollama本地 |
| `zhipu` | 智谱清言 |
| `qianwen` | 通义千问 |
| `wenxin` | 文心一言 |
## 模型 ID
前端模型选项内部 id 是 `{type}:{value}`,如 `openai:gpt-4o``type` 路由到对应服务商 SDK`value` 是模型名(透传上游)。
## 默认模型
每个分组带 `defaultModel`(管理员设置)。首次打开按此顺序选定:
1. 用户上次选过的模型IndexedDB `aiAssistant.model`
2. 第一个有 `defaultModel` 的分组的默认模型
3. 第一个分组的第一个模型
4. 否则空
## 模型能力差异
- **多模态**:仅部分模型支持,如 `gpt-4o``claude-3-5-sonnet``gemini-1.5-pro`
- **长文本**:默认 context 取最近 10 轮,超出截断;与模型最大 token 无关
## 不支持
- 不支持同一问题同时发多个模型对比
- 不支持终端用户自定义模型 / 改 API Key / base_url
- 切换模型不会清空历史会话,会用新模型续接
## 相关
- [[ai-assistant.model-switch.howto]]
- [[ai-assistant.model-empty.faq]]
- [[ai-assistant.multimodal.concept]]

View File

@ -1,59 +0,0 @@
---
id: ai-assistant.multimodal.concept
title: AI 助手多模态(图片输入)
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 看图
- 上传图片给 AI
- 视觉模型
- AI 多模态
- AI 识图
- AI 看截图
related_tools: []
related_pages: []
prerequisites:
- 当前模型支持视觉输入(如 gpt-4o / claude-3.5-sonnet / gemini-1.5-pro
negative:
- 仅图片,不支持视频 / 音频 / 文档
- 一次最多 5 张图片
- 图片会被压缩到长边 1568px JPEG原图不保留
- 切到不支持视觉的模型后发图会上游报错
last_verified: v1.7.90
---
# AI 助手多模态(图片输入)
## 定义
多模态指 AI 助手允许用户在对话中**同时附带图片**。图片以 base64 拼到 `content` 数组(`{type: 'image_url', image_url: {url: dataUrl}}`),与文本一起发给视觉模型解析。
## 三种添加方式
1. **点击图片按钮**:浮窗底部图片图标,弹系统文件选择器
2. **拖放**:把图片拖到浮窗,松手上传
3. **粘贴**:在输入框 Ctrl/Cmd + V 粘贴剪贴板里的图片
## 数量与大小约束
- 单次最多 5 张(`maxImages`),超出 toast「最多上传 5 张图片」
- 自动压缩:长边 ≤ 1568px、统一转 JPEG
- 原文件不上传,只上传压缩后的 dataUrl
## 视觉模型要求
- 必须选视觉模型才能正确解析(`openai:gpt-4o``claude:claude-3-5-sonnet``gemini:gemini-1.5-pro` 等)
- 非视觉模型(如 `deepseek:deepseek-chat``grok:grok-2`)通常忽略图片或上游报错
## 持久化
- 图片随会话一起保存
- 服务端转存到 `public/uploads/assistant/YYYYMM/{userid}/xxx.jpg`
- 再次打开会话通过 `serverImageMap` 拿回 URL 显示
## 不支持
- 不支持视频 / PDF / 音频;只接受 `image/*` MIME
- 不支持单张超大图保持原始分辨率
- 不支持拖到收起的浮按钮上(先展开)
- 不支持「不压缩直发」开关
## 相关
- [[ai-assistant.image-upload.howto]]
- [[ai-assistant.model-switch.howto]]

View File

@ -1,58 +0,0 @@
---
id: ai-assistant.page-action.concept
title: AI 操作页面的机制
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 控制页面
- AI 自动操作
- AI 怎么帮我操作页面
- AI 跳转页面
- 页面自动化
- AI 点按钮
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- AI 的页面操作仅在浏览器/桌面端会话窗口内生效,无法控制其他用户的页面
- 一次只能操作当前会话所在的页面,不能开新标签页
- 关闭浏览器或切到别的标签页时,页面操作会断连失败
- 跨源(外部站点)微应用 iframe 的内部不可操作,仅同源微应用插件可
last_verified: v1.7.91
---
# AI 操作页面的机制
## 定义
AI 助手通过高层导航和低层元素操作两类能力操作用户当前页面。主程序常驻 WebSocket`/ws`)把指令派发给前端,前端的 `action-executor.js` 执行真实 DOM 行为或路由跳转,结果回传给 AI 让对话继续。这类页面操作不是 MCP 工具,由 AI 助手在你的页面上执行。
## 两层能力
- **高层导航**:语义化命名(如 `open_task``navigate_to_dashboard`),参数明确(任务 ID由前端封装好 router 调用;优先用这层,稳定不易错
- **低层元素操作**:基于元素 ref 的通用动作click/type/select/focus/scroll/hover用于没封装好的细节操作
## 受支持的高层动作
- `open_task``open_dialog``open_project``open_file``open_folder`
- `navigate_to_dashboard / messenger / calendar / files`
- `close_app`:关闭当前打开的应用窗口(仅在有微应用打开时出现)。属外壳层动作,哪怕 AI 正停在该应用内部、甚至应用跨源读不到内部,也能直接关闭
## 受支持的低层元素动作
- `click``type``select``focus``scroll``hover`
## 微应用内部
当你打开了微应用插件(应用市场安装、反代到主站 `/apps/` 同源路径、以 iframe 呈现)并停在最前时,采集页面上下文与低层元素操作会**默认作用于该微应用内部**,可像操作主界面一样点按钮 / 填表 / 切菜单。多个微应用同时打开时只操作最前面那个切换或关闭应用后原先拿到的元素引用会失效AI 会被提示重新获取。跨源指向外部站点的微应用读不到内部AI 会提示改用数据命令或回到主界面。
## 不支持
- 不能模拟键盘组合键、不能拖拽
- 不能操作跨源(外部站点)微应用 iframe 的内部
- 不能跳转外部 URLgoForward 只走应用内路由)
- 不能伪造非用户主动触发的事件(如自动提交表单审批通过)
## 相关
- 让 AI 跳页面:[[ai-assistant.page-action.howto]]
- AI 操作元素:[[ai-assistant.element-action.howto]]
- 元素查找接口:[[ai-assistant.match-elements.concept]]
- 取页面上下文:[[ai-assistant.page-context-tool.concept]]

View File

@ -1,58 +0,0 @@
---
id: ai-assistant.page-context-tool.concept
title: AI 怎么知道你在哪个页面
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 看页面
- 页面上下文
- AI 怎么知道当前页
- AI 读取页面
- AI 上下文采集
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 仅当用户在 AI 浮窗当前会话所在的浏览器/桌面端窗口时才能采集
- 不能跨标签 / 跨设备同步采集,每个 socket 只对应一个页面
- 不读取密码框/被遮挡元素/隐藏元素
- 跨源(外部站点)微应用 iframe 的内部无法采集,会提示改用数据命令
last_verified: v1.7.90
---
# AI 怎么知道你在哪个页面
## 定义
当你在 AI 浮窗里问"这页有什么操作""帮我点这页的某个按钮"时AI 助手会向你当前的浏览器/桌面端页面请求页面上下文,包括:当前路由名(如 `manage-project`、URL、标题、可交互元素清单带 ref / name / role、该页可用的高层动作。结果由前端 `page-context-collector.js` 实时收集后回传给 AI。
## 返回字段
- `page_type`:路由名(如 `manage-task`
- `page_url` / `page_title`
- `elements`可交互元素ref / name / role
- `total_count` / `has_more` / `offset`:分页
- `available_actions`:该页可用的高层动作(如项目页可 `open_task`
- `ref_map`ref → 定位信息
- `frame`:本次采集所在上下文——`scope``main` 主界面 / `app` 微应用)、`app_name`(微应用时的应用名)、`operable`(是否可操作)
## 调用模式
- **轻量**`interactive_only=true` + `max_elements=20`
- **完整**:默认前 100 个(含内容)
- **搜索**:传 `query` 先关键词后向量匹配
- **采集范围**:默认采集"用户最前面看到的"页面——有同源微应用插件在最前打开时采集其 iframe 内部,否则采集主界面;也可指定只采主界面。跨源微应用读不到内部,会返回 `operable:false` 并提示降级。
## 隐式触发
用户在浮窗里问"这个页面有什么操作"、"帮我点这页的某按钮"、"切到下一项目"时AI 都会先采集当前页面上下文再决定下一步。
## 不支持
- 不返回每个元素的位置坐标(仅 selector
- 不会返回 input 框的当前值(不读取用户私有输入)
- 不能在弹窗/抽屉之外拿到全屏快照(仅 DOM 节点)
## 相关
- 元素匹配:[[ai-assistant.match-elements.concept]]
- 操作元素:[[ai-assistant.element-action.howto]]
- 页面操作机制:[[ai-assistant.page-action.concept]]

View File

@ -1,78 +0,0 @@
---
id: ai-assistant.page-context.concept
title: AI 助手页面上下文(弱提示词)
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 知道当前页面
- 页面感知
- AI 上下文
- 弱提示词
- 当前页面注入
- AI 现在在哪
related_tools: []
related_pages: []
prerequisites: []
negative:
- 弱提示词只传「页面类型 / 实体 id / 名称 / 对话类型」四类,不传业务详细数据
- 详细数据需要 AI 通过 MCP 工具自取
- 嵌入入口(专用 onBeforeSend不走弱提示词机制
last_verified: v1.7.90
---
# AI 助手页面上下文(弱提示词)
## 定义
**弱提示词**是 AI 助手浮窗对话时自动注入的极简「我现在在哪」描述,让 AI 知道用户提问发生在哪个项目 / 任务 / 对话页,能正确解析「这个项目 / 这条任务」之类指代。
## 注入格式
渲染为一行 `system` 消息穿插到 context 历史:
```
[当前页面] 项目详情页(project_id=123,名称:DooTask)
[页面切换] 任务详情页(task_id=4567,名称:修复 SSE 断流)
```
前缀:`[当前页面]` 首次注入,`[页面切换]` 后续在不同页面再提问时。
## 注入的字段
仅四类,绝不带其他业务数据:
| 字段 | 含义 |
|---|---|
| `type` | 实体类型task / dialog / project / file / report |
| `id` | 实体 id |
| `name` | 实体名称 |
| `dialogType` | 群聊 / 私聊,仅 dialog 有 |
## 为什么穿插历史
用户可能在不同项目 / 任务页连续提问。只放当前页会让历史里两个「这个项目」失去锚点。穿插能给历史每条用户消息打上「问题发生时所在的页面」AI 才能正确分辨。
## 可识别的页面
- 任务详情弹窗(最高优先)→ `task:{id}`
- 对话详情弹窗 → `dialog:{id}`
- 仪表盘 → `dashboard`
- 项目列表 / 详情 → `project-list` / `project:{id}`
- 消息列表 / 会话 → `messenger` / `dialog:{id}`
- 日历 → `calendar`
- 文件列表 / 详情 → `file-list` / `file:{id}`
- 工作汇报编辑 / 详情 → `report:{id}`
## 何时不注入
- 不可识别路由(登录页、个人设置等)
- 同 `contextKey` 连续提问
- 嵌入入口(带 `onBeforeSend`
## 详细数据怎么拿
弱提示词只告「在哪」不告「内容」。AI 需要看任务描述、项目统计时通过 MCP 工具自取(如 `get_task``get_project_data`)。
## 不支持
- 不支持把整页内容塞给 AI
- 不支持用户手动关闭弱提示词
- 不支持自定义注入字段
## 相关
- [[ai-assistant.embed-entry.concept]]
- [[ai-assistant.welcome-prompts.concept]]

View File

@ -1,80 +0,0 @@
---
id: ai-assistant.privacy.concept
title: AI 助手数据隐私
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 数据安全
- AI 对话保存在哪
- AI 会泄露吗
- AI 上传图片去哪
- DooTask AI 隐私
related_tools: []
related_pages: []
prerequisites: []
negative:
- 对话会通过 ai 插件转发给管理员配置的上游 LLM 服务商,受其隐私条款约束
- 不存在「AI 完全本地化」开关,除非管理员只配 Ollama 本地模型
- 用户无法自助导出会话(只能在浮窗手动清空历史)
last_verified: v1.7.90
---
# AI 助手数据隐私
## 数据存到哪里
### 对话内容
- 数据库表:`ai_assistant_sessions`,按 `userid` 行级隔离
- 其他普通用户绝对看不到别人会话
- 仅当前用户、系统管理员可通过后台数据库访问
### 图片
- 路径:`public/uploads/assistant/YYYYMM/{userid}/xxx.jpg`
- 按用户 id 分目录,删除会话时物理删除
### 配置 / 模型选择
- 存 IndexedDB `aiAssistant.model`(仅当前浏览器)
- 浮按钮位置 / 输入历史也存 IndexedDB不上传
## 数据传给谁
```
浏览器
→ DooTask 后端 (POST api/assistant/auth)
→ ai 插件容器 (dootask-ai)
→ 上游 LLM 服务商 (OpenAI / Claude / DeepSeek 等)
```
- 上游服务商由**系统管理员**决定
- 选 Ollama 本地模型则对话不出 DooTask 部署网络
- 选公网服务则按服务商隐私条款处理
## 发送上去的内容
- 本次提问的文本 + 图片(多模态时)
- 当前会话最近 10 轮 context
- 当前页面弱提示词(仅页面类型 + 实体 id + 名称,**不含**业务详细数据)
- DooTask 默认 system prompt
## 不会发送的
- 用户密码、token、密钥
- 不在 context 窗口内的历史会话
- 其他用户对话
- 私聊 / 群聊具体消息(除非用户主动复制到提问)
- 完整页面业务数据(只发弱提示词)
## 清理与删除
- 单条 / 清空当前桶:[[ai-assistant.session-delete.howto]]
- 清浏览器 IndexedDB清掉模型选择、浮按钮位置、输入历史
- 上游侧保留多久取决于服务商(如 OpenAI 默认 30 天)
## 不支持
- 不支持端到端加密让管理员都看不到
- 不支持把某条对话标记「不发送」
- 不支持自助导出全部历史
## 相关
- [[ai-assistant.auth.concept]]
- [[ai-assistant.session.concept]]
- [[ai-assistant.page-context.concept]]

View File

@ -1,70 +0,0 @@
---
id: ai-assistant.session.concept
title: AI 助手会话
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 会话
- AI 历史
- AI 对话记录
- AI session
- session_key
- 会话桶
related_tools: []
related_pages: []
prerequisites: []
negative:
- 单个桶最多 20 条会话,超过自动淘汰最早
- 嵌入式入口的会话不出现在浮窗历史里
- 删除会话不可恢复,对应图片也会从 public/uploads 物理删除
last_verified: v1.7.90
---
# AI 助手会话
## 定义
会话session是 AI 助手中一组连续的用户提问 + AI 回答集合,按「场景桶」隔离持久化到 `ai_assistant_sessions` 表,归当前用户所有。
## 关键属性
| 字段 | 含义 |
|---|---|
| `session_key` | **场景桶**,浮窗用 `global`,嵌入入口用各自 key |
| `session_id` | 唯一 id格式 `session-{时间戳}-{随机串}` |
| `title` | 自动取首条用户消息前 20 字 |
| `data` | JSON 数组,存所有 user/assistant/system 消息 |
| `images` | JSON 对象 `{imageId: 服务端路径}` |
| `updated_at` | 历史列表按其倒序 |
## 持久化时机
- 流式回答完成后立即保存
- 编辑历史问题、删除消息后保存
- 普通编辑期间有 2 秒防抖
## 桶session_key的作用
不同业务入口走不同桶:
- `global`:浮窗 + 快捷键 + 顶部「+」菜单
- `project-create`:新建项目 AI 助手
- `task-add`:新建任务 AI 助手
- `report-edit`:工作汇报 AI
- `chat-message`:消息输入 AI
切桶时先保存当前会话再载入目标桶历史列表,避免互相串扰。
## 数量限制
- 每个桶最多保留 20 条(`maxSessionsPerKey`
- 超过从最旧的开始淘汰
- 单会话内最多 50 条 message`maxResponses`
## 不支持
- 不支持跨用户 / 跨桶搜索;只查当前用户当前桶
- 不支持把某条会话从一个桶导到另一个桶
- 不支持手动改会话标题
## 相关
- [[ai-assistant.session-list.howto]]
- [[ai-assistant.new-chat.howto]]
- [[ai-assistant.session-delete.howto]]
- [[ai-assistant.embed-entry.concept]]

View File

@ -1,74 +0,0 @@
---
id: ai-assistant.streaming.concept
title: AI 助手流式输出
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 流式回答
- 边写边出
- AI 一边打字一边显示
- SSE 流
- AI 实时输出
related_tools: []
related_pages: []
prerequisites: []
negative:
- 不支持 WebSocket 推送,固定走 SSE
- 不支持手动重试单条;流断后该 message 标记 error需重新发送
- 同会话并发流会被前一个的发送动作清掉
last_verified: v1.7.90
---
# AI 助手流式输出
## 定义
AI 助手通过 **SSEServer-Sent Events** 接收上游 LLM 的逐 token 输出,每收到一个 chunk 就追加到当前 message 的 `rawOutput`,呈现 ChatGPT 般「边写边出」的效果。
## 数据流
1. `POST api/assistant/auth` → 拿 stream_key
2. `EventSource ai/invoke/stream/{stream_key}`
3. 监听三类事件:
- `append` → 追加(`entry.rawOutput += chunk`
- `replace` → 整段替换(`entry.rawOutput = chunk`
- `done` → 流结束(`entry.status = 'completed'`
4. 断流 / 异常 → `handleStreamFailed`
## 事件类型
| 事件 | 用途 |
|---|---|
| `append` | 普通增量 token最常见 |
| `replace` | 整段替换(工具结果回填、思考链重写) |
| `done` | 流结束payload 含 `error` 字段表示上游报错 |
## 状态机
每条 AI message 4 个状态:
- `waiting` → 已发出但首个 chunk 未到
- `streaming` → 正在接收 chunk
- `completed``done` 正常收到
- `error` → 上游错误、连接失败、用户中断
## 并发与归属
- 每个流绑定 `owner = {sessionKey, sessionId, localId}`
- 用户切到其他会话后,原流仍后台跑,结束时写回原会话存储
- 发新问题前会清掉同会话的所有活跃流,防止两段对话错位
## 中断恢复保护
- 关浮窗 / 页面崩溃后,下次加载会话发现 message 仍是 `streaming/waiting` 则归一为 `error`
- 避免「永远转圈」(`sanitizeResponsesForPersist`
## 滚动行为
- 视图在最底部时新 chunk 自动 `scrollToBottom`
- 用户向上翻历史时(距底 > 20px不强制下拉
## 不支持
- 不支持 WebSocket
- 不支持 chunk 级别撤销
- 不支持自动重试断流
## 相关
- [[ai-assistant.stop.howto]]
- [[ai-assistant.modal.concept]]
- [[ai-assistant.session-save.howto]]

View File

@ -1,53 +0,0 @@
---
id: ai-assistant.tool-call.concept
title: 工具调用的流式事件结构
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- tool_call 是什么
- AI 工具调用的过程
- 工具调用气泡
- AI 调用了工具显示什么
- tool_call 事件
related_tools: []
related_pages: []
prerequisites: []
negative:
- 单次回复可包含多次工具调用(并行或串行),不限于一次
- 工具调用结果不计入用户上下文 token但会消耗会话 token
- 用户不能在前端取消已发出的工具调用,只能整体中断本轮回复
last_verified: v1.7.90
---
# 工具调用的流式事件结构
## 定义
AI 助手回复以流式 SSE 推送给前端,事件中除了文本增量,还会出现工具调用片段。每次工具调用在浮窗里渲染为一个独立气泡,展示"工具名 + 参数 + 状态",让用户能看到 AI 在背后做什么。
## 一次完整工具调用的事件序列
1. `tool_call_start`:模型决定调工具,前端插入气泡,状态置「执行中」
2. `tool_call_arguments`(可多次):参数 JSON 增量流式拼接
3. `tool_call_result`:后端/前端返回结果,状态变「完成」或「失败」
4. 模型基于结果继续生成 `message` 文本
## 气泡可见信息
- 工具名(如 `list_tasks`
- 入参 JSON折叠/展开)
- 出参摘要(成功)或错误码(失败)
- 执行耗时
## 与普通文本的关系
- 工具结果不直接回给用户,而是回灌给模型
- 模型读结果后再生成下一段自然语言回答("我找到 3 条任务……"
- 用户体感是"AI 一边查一边说"
## 不支持
- 工具调用进行中无法手动改参数;要重来需点重试或重新提问
- 失败的工具调用不会自动二次重试(模型可能换工具或道歉)
## 相关
- 工具机制总览:[[ai-assistant.tools.concept]]
- 工具清单:[[ai-assistant.tools-list.concept]]
- 失败处理:[[ai-assistant.tool-failed.faq]]

View File

@ -1,66 +0,0 @@
---
id: ai-assistant.tools-list.concept
title: AI 助手可用工具清单
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 有哪些工具
- AI 能调用什么
- AI 工具列表
- MCP 工具有哪些
- AI 都能做什么
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 工具集合由系统维护,普通用户无法自定义增减
- 列表项名是后端工具名snake_case用户不需要记
- 不在清单中的能力 AI 无法直接执行(例如改系统设置、装插件)
last_verified: v1.7.90
---
# AI 助手可用工具清单
## 用户与组织
- `get_users_basic`:批量取用户昵称/邮箱/头像
- `search_users`:按关键词找人,支持按项目/对话筛选
## 任务
- `list_tasks`:列任务(状态/项目/时间筛选)
- `get_task`:取任务完整详情
- `create_task``update_task``complete_task``delete_task`
- `create_sub_task`:建子任务
- `get_task_files`:取任务附件
## 项目
- `list_projects``get_project``create_project``update_project`
## 消息与对话
- `search_dialogs`:搜对话
- `send_message`:发消息
- `send_task_ai_message`:作为 AI 向任务讨论区发消息
- `get_message_list`:取历史消息
## 文件
- `list_files``search_files``get_file_detail``fetch_file_content`
## 工作报告
- `list_received_reports``list_my_reports``get_report_detail``create_report``mark_reports_read`
- `generate_report_template`:基于已完成任务生成报告草稿
## 搜索
- `intelligent_search`:跨任务/项目/文件/联系人/消息统一语义搜索
## 页面操作(非 MCP 工具)
AI 助手还能在你当前的浏览器/桌面端页面上帮你打开任务/项目/对话、跳功能页、点击/输入/选择/滚动页面元素。这类页面操作不在 MCP 工具清单内,由 AI 助手在你的页面上直接执行。
## 图片理解(非 MCP 工具)
把图片交给 AI 助手后AI 可直接识别图中内容(多模态),无需单独的图片文字提取工具。
## 知识库
- `search_help_docs`检索本知识库DooTask 功能说明)
- `get_session_image`:取用户上传到会话的图片

View File

@ -1,52 +0,0 @@
---
id: ai-assistant.tools.concept
title: AI 助手的工具调用机制
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 工具
- AI 调工具
- 怎么让 AI 调工具
- 让 AI 调用工具
- MCP 工具
- AI 怎么操作系统
- function calling
- AI 能做什么
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 工具是否可用取决于所选模型是否支持 tool/function calling部分模型仅能纯文本回答
- 工具调用结果会展示给用户,不会静默执行
- 用户没权限的操作(如读不到的任务)即使 AI 调工具也会被后端拒绝
last_verified: v1.7.90
---
# AI 助手的工具调用机制
## 定义
DooTask AI 助手通过 MCPModel Context Protocol协议调用工具把"问 AI"扩展为"让 AI 帮我做事"。AI 收到用户请求后判断是否需要调工具,例如查任务、发消息、跳页面,由插件 `mcp_server` 把请求路由到对应的后端 API 或前端动作执行器,再把结果回灌给模型,模型基于结果继续回答。
## 工具来源
- **dootask-mcp 内置工具**29 个,覆盖任务/项目/消息/文件/报告/搜索
- **AI 助手内置工具**`search_help_docs`(检索本知识库)、`get_session_image`(取多模态图片)
- **doo 命令行工具**AI 助手还可经内置的 `doo` 命令行(以你的身份、在你的权限内)直接完成任务/项目/消息/文件/报告/搜索/页面等操作;它是把上述能力统一成一个命令行入口,权限同样由后端校验
- 工具清单维护在仓库 `resources/ai-kb/_meta/tool-binding.yaml`
## 数据工具与页面操作
- **数据工具MCP**:直接调后端 API`create_task``send_message`),不依赖前端 UI
- **页面操作(非 MCP 工具)**AI 助手还能在你当前的浏览器/桌面端页面上打开任务/跳页面、点击/输入页面元素;这类能力不在 MCP 工具清单内,由 AI 助手在你的页面上执行
## 触发条件
- AI 模型本身必须支持 tool callingOpenAI / Claude / DeepSeek / Qwen 等主流模型均支持)
- 管理员在系统设置「AI 模型」中开启该模型
- `mcp_server` 插件已安装并运行
## 相关
- 工具完整清单:[[ai-assistant.tools-list.concept]]
- 工具调用流式事件结构:[[ai-assistant.tool-call.concept]]
- 工具调用失败处理:[[ai-assistant.tool-failed.faq]]

View File

@ -1,75 +0,0 @@
---
id: ai-assistant.welcome-prompts.concept
title: AI 助手欢迎语与快捷提示
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 欢迎页
- AI 快捷提示
- AI 推荐问法
- AI 起手
- AI 建议
- AI 提示卡片
related_tools: []
related_pages: []
prerequisites: []
negative:
- 用户不能自定义快捷提示卡片
- 卡片在每次场景切换时会重抽,并非固定不变
- 卡片点击只是把文本填入输入框,不会自动发送
last_verified: v1.7.90
---
# AI 助手欢迎语与快捷提示
## 定义
打开 AI 助手浮窗、**还没有任何对话**时显示的引导界面,包含 AI 图标 + 「欢迎使用 AI 助手」标题 + 若干个**快捷提示卡片**。卡片内容根据当前页面场景动态切换。
## 卡片分类
按四类设计确保多样性:
| 类型 | 含义 | 示例 |
|---|---|---|
| `query` | 查询 / 概览 | 「我今天有哪些任务?」 |
| `action` | 推进 / 操作 | 「帮我把这条任务标记完成」 |
| `sync` | 同步 / 协作 | 「给项目组发一条进度更新」 |
| `review` | 复盘 / 总结 | 「总结一下这周的工作」 |
## 与页面场景联动
卡片基于以下数据动态生成:
- 当前路由(仪表盘 / 项目 / 任务 / 消息 / 文件 / 日历)
- 当前打开的弹窗(任务 / 对话)
- 当前项目 / 任务 / 对话 id
- 当前语言(中 / 英)
切换页面时通过 `welcomePromptsKey` watcher 触发100ms 防抖避免闪屏。
## 点击行为
1. 点击某张卡片
2. 卡片文本被填入输入框
3. 输入框自动获焦
4. **不会**自动发送,需手动按发送或回车
## 显示条件
- AI 助手浮窗已打开
- `visibleResponses.length === 0`(当前会话无消息)
- `displayMode === 'chat'`modal 模式由业务方控制)
## 何时刷新
- 路由变更
- 打开 / 关闭任务弹窗
- 打开 / 关闭对话弹窗
- 切换项目
均走 `welcomePromptsKey` watcher + 100ms 防抖。
## 不支持
- 不支持自定义卡片文案
- 不支持「关闭欢迎提示卡片」开关
- 不支持把某条卡片置顶或常驻
## 相关
- [[ai-assistant.modal.concept]]
- [[ai-assistant.page-context.concept]]

View File

@ -1,59 +0,0 @@
---
id: approve.form.concept
title: 审批表单字段
type: concept
feature: approve
scope: admin
locale: zh
aliases:
- 审批表单
- 表单字段
- 表单设计
- 自定义字段
- 申请单字段
- 表单组件有哪些
- 申请类型字段
related_tools: []
related_pages: [application]
prerequisites:
- 当前用户是系统管理员
- 在流程模板编辑器中
negative:
- 当前版本不支持公式字段(如「时长 = 结束时间 - 开始时间」自动算)
- 不支持联动字段A 字段值变化时显示/隐藏 B 字段)
- 不支持把表单字段值用作下一节点审批人路由依据(无条件分支)
- 表单字段一旦发布后改动,已提交的旧实例展示按当时快照不回填
last_verified: v1.7.90
---
# 审批表单字段
## 定义
审批表单是发起人填写的申请单结构,由若干**字段组件**拼成。管理员在流程模板编辑器iframe 内)拖拽这些组件即可设计表单。表单值随流程实例一起存到插件库的 `var` 字段JSON并随状态变化贯穿始终。
## 内置字段组件
- **单行文本**:限长字符串,如「申请人姓名」「合同编号」
- **多行文本**:长描述,如「请假事由」「报销说明」
- **数字**:整数 / 小数,如「报销金额」
- **日期 / 日期时间**:年-月-日 或精确到分钟,常用于开始/结束时间
- **单选 / 多选 / 下拉**:固定选项集,如「假期类型」可枚举「年假/事假/病假/调休/产假/陪产假/婚假/丧假/哺乳假/产检假/其他」
- **附件 / 图片**:上传文件,前端控件复用主程序 `ImgUpload`;图片限制宽高与张数(默认上限 3 张、2048×2048
- **明细 / 子表**:一对多结构,如报销单的多行费用明细
- **金额 / 时长**:业务语义字段(基于数字字段封装)
## 必填、提示、默认值
- 每个字段可配置 `required`(必填)、占位提示、默认值
- 必填项校验在发起页前端拦截;提交到主程序 `process__start` 再做二次校验
## 与流程节点的关系
- 表单字段是"装数据的",节点是"管流转的",两者解耦
- 节点拿不到 form 字段做路由决策(不支持条件分支)
## 数据存储
- 表单值在主程序前端组成 `var` JSON 后随 `proc_name + department_id` 一起调 `approve/process/start`
- 插件把 `var` 整体存进 proc inst 行;后续审批人查看时反序列化展示
## 不支持
- 不支持字段联动 / 公式 / 条件分支
- 不支持表单级权限(不能按角色显示不同字段)
- 不支持跨流程模板字段复用

View File

@ -1,49 +0,0 @@
---
id: approve.history.concept
title: 审批流程历史 History
type: concept
feature: approve
scope: end-user
locale: zh
aliases:
- 审批历史
- 审批操作记录
- 流程留痕
- 谁审过
- 流程节点历史
- ProcInstHistory
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 approve 插件
negative:
- 历史记录不可手动编辑,只由系统在节点流转时写入
- 删除审批process/delById会连带删除该流程的全部历史
- 历史不会单独导出,导出走 admin 的 approve/export 数据导出
last_verified: v1.7.90
---
# 审批流程历史 History
## 定义
流程历史(`ApproveProcInstHistory`,表 `approve_proc_inst_history`)是每个流程实例([[approve.process-inst.concept]])在节点流转时留下的快照,记录谁发起、当前节点、最近意见、整体状态,用于已结束审批的留档查询和驱动「已办」「抄送我(已结束)」两类列表。
## 关键字段
- **proc_def_id / proc_def_name**:所属模板 ID 和名称
- **title**:审批标题
- **start_user_id / start_user_name**:发起人
- **department_id / department / company**:发起部门和公司
- **node_id / candidate / task_id**:当前节点、候选人 userid 串、task ID
- **start_time / end_time / duration**:开始/结束/持续时长
- **state**0 待审批 / 1 审批中 / 2 通过 / 3 拒绝 / 4 撤回
- **is_finished / var**:是否结束 / 表单数据 JSON
- **latest_comment / global_comment**:最近一次意见 / 全文评论汇总
## 谁会读取
- 「已办」:`approve/procHistory/findTask`
- 「抄送我」已结束:`approve/procHistory/findProcNotify`
- 「已发起」已结束:`approve/procHistory/startByMyself`
- 详情页流程图:合并 `node_infos` 与历史渲染
## 副作用:用户请假/外出状态
静态方法 `getUserApprovalStatus(userid)` 按当前时间是否落在某条已通过的「请假/外出」表单时段内决定用户在系统其他地方的「请假中」标签。1 分钟缓存。

View File

@ -1,58 +0,0 @@
---
id: approve.node.concept
title: 审批节点类型
type: concept
feature: approve
scope: admin
locale: zh
aliases:
- 审批节点
- 单人审批
- 会签是什么
- 顺序会签
- 并行会签
- 或签
- 多人审批怎么配
- 审批人怎么设
related_tools: []
related_pages: [application]
prerequisites:
- 当前用户是系统管理员
- 在流程模板编辑器中
negative:
- 当前版本不支持条件分支节点(按表单字段值自动路由到不同审批人),节点链只能串行/并行
- 不支持嵌套子流程节点
- 不支持回退到任意节点:拒绝直接结束流程,不能让发起人改了再走原路
last_verified: v1.7.90
---
# 审批节点类型
## 定义
流程模板由若干**节点**串成一条链。一个节点 = 一步审批/抄送。节点决定"这一步由谁参与、用什么方式参与、参与后流程怎么走"。审批人来源支持指定具体用户、按角色/部门负责人动态解析。每条流程发起后会生成对应的"审批任务task"分发到各节点候选人手上。
## 主要节点类型
- **发起节点**:流程起点,自动以申请人身份填充;不需要配置审批人
- **单人审批**1 个候选人,处理后流程进入下一节点
- **顺序会签**:多个审批人按顺序处理,前一人通过才轮到下一人;任一人拒绝整单拒绝
- **并行会签**:多个审批人同时收到任务,**全部**通过才进入下一节点;任一人拒绝整单拒绝
- **或签**:多个候选人同时收到任务,**任一人**处理即代表全节点完成(典型用于"任一主管审批"
- **抄送节点**通知性节点候选人只收到通知在「抄送我的」Tab 看到),无须操作,流程不等待
## 审批人来源
- 指定具体用户:在编辑器里勾选成员列表
- 部门负责人:动态解析为发起人当前部门的 `owner_userid`(在 `UserDepartment` 表里维护)
- 角色:按主程序角色匹配
- 发起人自选:留空让发起人发起时手动指定
## 节点完成后的通知
节点产生新任务后,主程序通过 `approval-alert` 机器人在群聊推送"待你审批"模板消息给候选人;状态变更(通过/拒绝/撤回)也走同一机器人推送。
## 与状态的关系
- 整单状态审批中1/ 通过2/ 拒绝3/ 撤回4
- 当前所在节点 + 候选人由插件维护,主程序通过 `process__getProcessById` 拿到
## 不支持
- 不支持条件分支(不能按表单字段值 IF X 自动路由到分支 A需要按条件走不同审批人时把流程拆成多个流程模板如「请假 3 天以内」「请假 3 天以上」各建一个),由发起人按情况选择
- 不支持任意节点回退
- 不支持节点级 SLA 超时自动转交

View File

@ -1,47 +0,0 @@
---
id: approve.notify.concept
title: 审批通知与「审批助手」机器人
type: concept
feature: approve
scope: end-user
locale: zh
aliases:
- 审批机器人
- 审批通知
- 审批助手
- approval-alert
- 怎么收到审批提醒
- 审批卡片
related_tools: []
related_pages: [application, messenger]
prerequisites:
- 应用市场已安装 approve 插件
- 当前账号未屏蔽「审批助手」机器人会话
negative:
- 不支持改成第三方 webhook 推送
- 不支持邮件 / 短信 / APP 推送渠道(只发应用内聊天)
- 不支持自定义模板文案
- 机器人不能被「@」也不能直接对话指令
last_verified: v1.7.90
---
# 审批通知与「审批助手」机器人
## 定义
审批的所有通知都通过系统机器人「审批助手」userid `approval-alert`)的 1 对 1 私聊推送,消息类型 `template`(卡片)。卡片含标题、关键字段、缩略图(请假类带图片时),底部「查看详情」跳进审批详情。
## 何时发卡片
后端 `approveMsg()``type` 投递:
| type | 触发 | 收件人 | 标题样例 |
|---|---|---|---|
| `approve_reviewer` | 到我作审批人节点 | 待审批人 | {发起人} 提交的「{模板}」待你审批 |
| `approve_notifier` | 到我所在 notifier 节点 | 抄送人 | 抄送 {发起人} 提交的「{模板}」记录 |
| `approve_comment_notifier` | 我参与的审批被加全文评论 | 其他相关方 | {评论人} 评论了 {发起人} 的「{模板}」审批 |
| `approve_submitter` | 我发起的被通过/拒绝 | 发起人 | 您发起的「{模板}」已通过 / 被 {审批人} 拒绝 |
## 卡片更新机制
审批人同意/拒绝、发起人撤销时不发新卡,而用 `msg_id` 反查原卡片调 `change-{msg_id}` 原地更新(绿-通过/红-拒绝/灰-撤回),避免聊天里堆几十条。
## 未读徽标
`approve_reviewer` 推送时附带 WebSocket 事件 `approve/unread`,「审批」入口和 Tab「待办」名后的数字立即 +1处理后 -1。数量接口 `approve/process/doto`

View File

@ -1,46 +0,0 @@
---
id: approve.concept
title: 审批中心是什么
type: concept
feature: approve
scope: end-user
locale: zh
aliases:
- 审批是什么
- 审批流程是什么
- approve 插件
- 什么是流程审批
- 工作流
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 approve 插件
negative:
- 审批是独立插件,未安装时整个功能不可用
- 不支持条件分支(按表单值路由到不同审批人)
- 不支持嵌套子审批
- 表单不支持公式计算字段
last_verified: v1.7.90
---
# 审批中心是什么
## 定义
审批中心approve是 DooTask 的内置流程审批应用,用于在企业内提交、流转、处理表单类申请。典型场景:请假、出差、报销、用印、采购、合同会签。它是独立插件(独立 docker 服务 + 独立数据库),主程序通过 `ApproveController` 代理调用并把消息回写到聊天会话。
## 三个核心对象
- **流程模板 ProcDef**:管理员预先定义的审批样板,含表单字段、审批人节点、抄送人节点。普通用户只能选用,不能修改
- **流程实例 ProcInst**:一次具体的审批运行;用户每提交一次就生成一条,详见 [[approve.process-inst.concept]]
- **节点 Node**:模板里的步骤;常见类型 `starter`(发起)、`approver`(审批人)、`notifier`(抄送)、`end`(结束)
## 三类角色
- **发起人**:提交审批的人,能撤回未结束的审批、能给已结束的审批补评论
- **审批人**:在「待办」看到任务,可同意或拒绝
- **抄送人**:在「抄送我」看到知会,无须操作
## 状态机
流程实例的 `state`1 审批中、2 已通过、3 已拒绝、4 已撤回。详情页右上角用 Tag 显示,列表也按这个色区分。
## 与项目/任务/聊天的关系
- 审批不属于任何项目,是独立工作流
- 所有通知通过「审批助手」机器人发到 1 对 1 聊天([[approve.notify.concept]]

View File

@ -1,43 +0,0 @@
---
id: approve.plugin.concept
title: 审批插件架构
type: concept
feature: approve
scope: end-user
locale: zh
aliases:
- 审批是插件吗
- approve 插件是什么
- 审批中心怎么部署的
- 为什么审批要单独装
- 审批不在主程序里吗
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- approve 不是主程序内置功能,必须先在应用市场安装插件才能用
- 审批数据存在独立的 `<前缀>approve_*` 数据表里,不在主程序业务表
- 卸载插件时若勾选「删除数据」会清空全部审批数据,无法恢复
last_verified: v1.7.90
---
# 审批插件架构
## 定义
审批approve是 DooTask 的独立插件,由 `kuaifan/dooapprove` Docker 镜像提供一套独立的工作流引擎服务。主程序通过反向代理与之通信,所有审批的流程定义、实例、任务、历史都由插件维护,不在主程序业务表里。
## 关键属性
- **独立容器**:插件作为 docker-compose 服务名 `approve` 启动,端口仅在内网暴露
- **独立数据库表**:复用主库实例但表前缀为 `<DB_PREFIX>approve_`(如 `pre_approve_*`),与主程序业务表逻辑隔离
- **HTTP 反代**:主程序 nginx 把 `/approve/` 转给插件容器;`/approve/api/` 先经 `/approveAuth` 校验主程序 token 再放行
- **业务桥接**:主程序 `ApproveController` 通过 `http://approve` 调用插件 REST 接口(路径前缀 `/api/v1/workflow/...`),把结果包成 `Base::retSuccess` 返回前端
- **通知桥接**:审批状态变化通过 `approval-alert` 机器人在 DooTask 群聊中下发模板消息
## 与主程序的关系
- 主程序登录 token = 审批插件身份凭据(通过 `verifyToken` 接口校验)
- 主程序用户/部门/机器人是审批的"人员主数据",审批不复制用户表
- 用户感知不到容器分离:在 [[app-system.approve.howto]] 描述的「审批中心」页面内完成所有操作
## 不支持
- 主程序无法直接 SQL 查询审批数据,必须经插件 API
- 关闭/卸载插件后无法发起新审批:「应用 - 审批」入口在新发起处会报错(`Apps::isInstalledThrow`

View File

@ -1,51 +0,0 @@
---
id: approve.process-inst.concept
title: 流程实例 ProcInst 是什么
type: concept
feature: approve
scope: end-user
locale: zh
aliases:
- 流程实例
- 审批单
- ProcInst
- 审批运行
- 一次审批
- 流程 ID
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 approve 插件
negative:
- 流程实例不可改字段,提交后表单只读
- 一旦后续节点已被任何审批人处理,发起人不能再撤销
- 已结束的实例只有发起人或管理员能删([[approve.doto.howto]]
last_verified: v1.7.90
---
# 流程实例 ProcInst 是什么
## 定义
流程实例ProcInst是「一次具体的审批运行」的对象由发起审批时创建。模板ProcDef是图纸实例是按图纸跑出来的一条具体审批单。每提交一次就生成一个新实例有唯一数字 ID。后端表 `approve_proc_inst`,主程序通过 `approve/process/findById` 取数据。
## 关键属性
- **id**:实例唯一 ID
- **proc_def_name**:模板名(如「请假申请」)
- **start_user_id / start_user_name**:发起人 ID 和昵称
- **start_time**:提交时间
- **state**1 审批中 / 2 已通过 / 3 已拒绝 / 4 已撤回
- **is_finished**是否结束state ≠ 1 即结束)
- **task_id**:当前 task ID处理动作要带
- **candidate**:当前候选审批人 userid 逗号串
- **node_id / node_infos**:当前节点 ID + 所有节点状态数组,用于渲染流程图
- **var**表单字段对象type / start_time / end_time / description / other 等)
- **global_comments**:全文评论数组([[approve.comment.howto]]
## 生命周期
1. **创建**`approve/process/start`state=1
2. **流转**:每次 `approve/task/complete` 推进节点
3. **结束**state 变 2/3/4
4. **清理**:仅结束态可调 `approve/process/delById` 物理删除
## 与历史记录的关系
每次节点流转写一条 [[approve.history.concept]]`approve_proc_inst_history`),实例被删后历史也消失。

View File

@ -1,48 +0,0 @@
---
id: approve.template.concept
title: 流程模板(流程定义)
type: concept
feature: approve
scope: admin
locale: zh
aliases:
- 流程模板
- 审批模板
- 流程定义
- procdef 是什么
- 流程名称
- 审批流程是什么
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 approve 插件
negative:
- 流程模板只能由系统管理员创建、编辑、删除;普通成员只能基于已发布模板发起申请
- 删除模板会同时清空该模板下的所有审批数据,不可恢复
- 模板间不可复制:每个模板都要在编辑器里独立配置节点和表单
last_verified: v1.7.90
---
# 流程模板(流程定义)
## 定义
流程模板Process Definition简称 procdef是审批插件里"审批种类"的元数据,定义了一类审批的全部行为:表单字段、节点顺序、每个节点的审批人/抄送人。普通成员发起的每一单审批(流程实例)都必须基于某个已发布的流程模板。常见模板:请假申请、报销申请、出差申请、用印申请、采购申请。
## 关键属性
- **唯一性**:以 `name` 区分(如「请假申请」),同名模板不允许重复创建
- **版本**:每次发布累计 `version`;旧版本会被新版本顶替,进行中的审批仍按当时的版本走完
- **状态**:草稿(编辑中)/ 已发布(前台可选)
- **存储位置**:插件独立数据库 `<前缀>approve_*` 表,不在主程序业务表
- **生效范围**:全租户共享,不按部门隔离;要按部门分模板请改用不同 `name`
## 与流程实例的关系
- 一个模板procdef= 一份蓝图
- 用户每发起一单 = 创建一个流程实例proc inst状态独立流转
- 删除模板:插件会同时清空所有以该模板发起的实例,**不可恢复**
## 与节点 / 表单的关系
- 流程模板包含两部分配置:**节点链**(决定走哪几步、由谁审批)见 [[approve.node.concept]]、**表单字段**(决定申请人填什么)见 [[approve.form.concept]]
- 节点和表单在同一个流程编辑器iframe 内)一起设计、一起发布
## 创建入口
管理员在审批中心顶部「流程设置」按钮 → 「+」新建,详细步骤见 [[approve.template.howto]]。

View File

@ -1,39 +0,0 @@
---
id: checkin.face.concept
title: 人脸签到原理与依赖
type: concept
feature: checkin
scope: end-user
locale: zh
aliases:
- 人脸识别原理
- face 插件
- 人脸签到依赖
- 刷脸打卡怎么工作的
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 face 插件
last_verified: v1.7.90
---
# 人脸签到原理与依赖
## 定义
人脸签到是 DooTask 签到的一种方式,依赖独立的 **face 插件**提供人脸识别后端服务(容器名 `face`,内部端口 7788。主程序只负责存储人脸图片地址 (`UserCheckinFace.faceimg`) 和触发签到记录写入,**所有特征提取、比对都由 face 插件完成**
## 工作流程
1. 成员在签到设置上传人脸图片
2. 主程序把图片 base64 后 POST 到 `http://face:7788/user`,参数含 `enrollid`(成员 ID`name`(昵称)、`backupnum=50`
3. face 容器把特征存入设备库
4. 现场人脸识别一体机扫到该成员 → 调主程序 API 写一条 `UserCheckinRecord`
## 关键依赖
- **face 插件**:人脸识别引擎容器,未安装会抛 `Apps::isInstalledThrow('face')` 异常
- **人脸识别一体机硬件**:插件 README 注明「需配合指定硬件设备使用」
- **管理员开关**:「签到方式」勾选「人脸签到」+「允许修改」开启「允许成员上传人脸图片」
## 不支持
- 主程序自带的浏览器 / WebRTC 摄像头不能直接当人脸打卡器
- face 插件镜像较大(约 15MB+),首次安装下载较慢
- 删除成员或卸载插件后face 容器内的特征不会自动清空,需要管理员手动删除

View File

@ -32,7 +32,7 @@ last_verified: v1.7.90
- **人脸签到face****需要安装 face 插件**应用市场搜「Face check-in」并配套人脸识别硬件设备
## 关联应用市场
- `face` 插件:人脸识别后端服务,未装时人脸上传 / 现场刷脸都会失败,详见 [[checkin.face.concept]]
- `face` 插件:人脸识别后端服务,未装时人脸上传 / 现场刷脸都会失败(人脸签到详细说明随 face 应用知识库提供)
- `approve` 插件:影响提醒筛选——已请假 / 外出审批的成员不会收到缺卡提醒
## 不支持

View File

@ -1,55 +0,0 @@
---
id: drawio.concept
title: 流程图drawio是什么
type: concept
feature: drawio
scope: end-user
locale: zh
aliases:
- drawio
- 流程图
- 画流程图
- draw.io
- DooTask 流程图
- UML 图
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 drawio 插件
negative:
- 流程图编辑能力不是主程序内置,未装 drawio 插件无法新建 `drawio` 类型文件
- 不支持把 drawio 图形直接嵌入到任务详情/讨论消息中(只能作为文件链接发送)
- 大图(千级节点)渲染会变慢,建议拆图
last_verified: v1.7.90
---
# 流程图drawio是什么
## 定义
流程图是 DooTask 文件系统中的一种文件类型(`type=drawio`用于绘制流程图、UML、ER 图、网络拓扑、思维导图等通用图形。它由独立的 drawio 插件提供编辑器(基于开源 jgraph/drawio主程序通过 iframe 嵌入 `drawio/webapp/index.html`,文件内容存到 DooTask 自己的文件库里。
## 关键属性
- **文件类型**`drawio`(与 `mind` 思维导图、`document` 文本、`word/excel/ppt` 平行)
- **存储位置**DooTask 文件系统(个人文件 / 项目文件 / 共享)
- **编辑器**:嵌入式 drawio 完整编辑器,含图形库、画布、属性面板
- **导出**:支持导出 PNG / PDF依赖插件内置的 export-server缺它则导出失效
- **历史版本**:随 DooTask 文件历史一同保存
## 支持的图形类型
- 流程图、泳道图
- UML 类图、时序图、用例图
- 网络拓扑、机柜图
- 实体关系ER
- 思维导图(更建议用专用的 minder 插件)
- 各类业务建模、原型草图
## 与其他文件类型的关系
- **vs minder 思维导图**思维导图专注放射结构节点编辑更轻drawio 是通用图形,自由度高
- **vs OnlyOffice Word/Excel**OnlyOffice 支持多人实时drawio 单人编辑
- **vs DooTask 内置 document**document 是富文本/Markdown没有矢量图形能力
## 相关
- 插件元信息:[[drawio.plugin.concept]]
- 创建流程图:[[drawio.create.howto]]
- 入口在哪:[[drawio.entry.menu-map]]
- 内置模板:[[drawio.template.concept]]

View File

@ -1,53 +0,0 @@
---
id: drawio.plugin.concept
title: drawio 插件元信息
type: concept
feature: drawio
scope: admin
locale: zh
aliases:
- drawio 插件
- 流程图插件
- 安装 drawio
- drawio 插件版本
- draw.io 集成
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- 主程序不内置流程图编辑器,未装插件时新建文件菜单不会显示「图表」
- 插件体积大约 700MB下载较慢需要稳定网络
- 缺少同包的 export-server 时PNG/PDF 导出会失败
last_verified: v1.7.90
---
# drawio 插件元信息
## 定义
流程图能力由 `drawio` 插件提供(应用市场 app id 为 `drawio`,当前主版本 30.0.4,基于开源 jgraph/drawio。插件包内除了 drawio 前端,还包含一个 export-server镜像 `kuaifan/export-server`)负责把图形导出为 PNG/PDF。主程序仅以 iframe 加载 `drawio/webapp/index.html`,编辑器交互与文件保存全部跑在前端 + 主程序文件 API。
## 关键属性
- **作者**社区维护Community上游 https://www.drawio.com/
- **分类**:微应用(不在管理员应用区)
- **包大小**:约 700MB含 drawio 资源 + export-server 镜像)
- **运行形态**:静态资源 + 一个导出服务容器
- **关键依赖**`webapp/index.html``EXPORT_URL` 指向插件内的 `/drawio/export/`,删 export-server 会导致导出 PNG/PDF 失效
- **数据存储**:图形内容存到主程序文件表(`type=drawio`),不在插件容器单独存
## 安装与启用
1. 在应用市场管理员入口搜索「Drawio」或「流程图」
2. 点击安装,等待资源下载(约 700MB请通过「安装日志」查看进度
3. 安装完成后插件自动启用,文件新建菜单立即出现「图表」选项
## 卸载影响
- 卸载后菜单消失,原有 `drawio` 文件保留在文件库中但无法继续编辑/预览
- 重新安装后旧文件继续可用
## 已知限制
- 网络不畅时首次加载图形库较慢
- 离线环境需提前推到内网镜像源
## 相关
- 是什么:[[drawio.concept]]
- 入口在哪:[[drawio.entry.menu-map]]
- 内置模板:[[drawio.template.concept]]

View File

@ -1,60 +0,0 @@
---
id: drawio.template.concept
title: drawio 内置图形与模板
type: concept
feature: drawio
scope: end-user
locale: zh
aliases:
- drawio 模板
- drawio 图形库
- drawio 能画什么
- 流程图都有哪些类型
- drawio 支持的图形
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 drawio 插件
negative:
- DooTask 不提供「业务模板市场」,新建图永远是空白画布
- 不能直接将 drawio 图形粘贴到 DooTask 任务详情或讨论消息
- 模板/形状无法跨公司账号共享(每个部署独立)
last_verified: v1.7.90
---
# drawio 内置图形与模板
## 定义
drawio 编辑器自带丰富的图形库Shape Libraries和绘图分类但 DooTask 集成时**不预置业务模板**。每次新建图都从空白画布开始,需要绘图者从图形库手动拖出元素或在 drawio 内的「File → New From Template」选择官方模板。
## 主要图形分类
drawio 左侧图形库可勾选启用以下分类(部分):
- 通用形状General
- 流程图Flowchart
- 泳道图Swimlanes
- UML类图、时序图、用例图、状态图、活动图
- 实体关系ER
- 网络与基础设施Cisco / AWS / Azure / GCP / Kubernetes 图标)
- 软件架构C4 模型)
- 业务流程BPMN
- 思维导图mockup
- 电气、布线、机柜
- 安卓/iOS 线框图
## 选用方式
- 编辑器左下角「More Shapes」勾选要启用的图形库
- 直接从左侧图形库拖元素到画布
- 通过菜单 `File → New From Template` 选择官方预设模板(流程示例、组织结构等)
## 与思维导图minder对比
- drawio 也能画思维导图,但灵活但偏「画」
- 专注思维导图推荐用专门的 [[minder.concept]] 插件,节点操作更顺手
## 不支持
- DooTask 主程序不预置业务模板(如审批流程模板等)
- 模板不能跨部署共享,只能依赖 drawio 上游内置的模板
- 不能上传自定义图形库到所有用户
## 相关
- 是什么:[[drawio.concept]]
- 创建:[[drawio.create.howto]]

View File

@ -1,48 +0,0 @@
---
id: fileview.concept
title: 文件预览fileview是什么
type: concept
feature: fileview
scope: end-user
locale: zh
aliases:
- fileview
- 文件预览
- 在线预览
- 预览 PDF
- 预览 Word
- kkfileview
- 在线看文件
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 fileview 插件
negative:
- fileview 只提供「只读预览」,不能在线编辑(编辑要装 OnlyOffice见 [[office.concept]]
- 主程序本身能直接预览图片jpg/png/gif 等)和文本/代码,这些不需要 fileview
- 视频/音频在线播放走主程序自带能力,也不属于 fileview 范畴
last_verified: v1.7.90
---
# 文件预览fileview是什么
## 定义
fileview 是 DooTask 的**通用文件在线预览**能力,基于开源 kkfileview 引擎由独立插件提供。所有不能被主程序直接渲染的文件类型PDF、Word 系、Excel 系、PPT 系、Visio、CAD 等)在点击文件名时会跳转到 fileview 的预览页(路径 `fileview/onlinePreview?url=<base64 文件地址>`),返回浏览器内可滚动、可缩放、可翻页的页面。
## 关键属性
- **只读**:仅查看,不可编辑(编辑能力需 OnlyOffice 插件)
- **入口**:点击文件即可,主程序对超出本地预览范围的文件自动 301 到 fileview 路径
- **格式覆盖**:远超主程序自带能力,包括 Office 全家桶、PDF、各类压缩包、3D 模型、CAD 等(详见 [[fileview.supported.concept]]
- **加载机制**fileview 后端拉取文件 → 转码或解析 → 推送渲染结果到浏览器
- **依赖**:依赖独立 fileview 容器持续运行
## 与其他预览能力的关系
- **图片**jpg/jpeg/png/gif/bmp 等):主程序内置直接渲染,不走 fileview
- **代码/文本**2MB 内、扩展名属于 `codeExt` 列表):主程序内嵌 AceEditor 渲染,不走 fileview
- **Word/Excel/PPT**:装了 OnlyOffice 时走 OnlyOffice 编辑器(可编辑);没装但装了 fileview 则走 fileview 只读预览
- **思维导图mind/ 流程图drawio**DooTask 自己的图形文件,由 minder/drawio 插件渲染,不走 fileview
## 相关
- 插件元信息:[[fileview.plugin.concept]]
- 支持的文件类型:[[fileview.supported.concept]]
- 在线编辑 Office 文档:[[office.concept]]

View File

@ -1,53 +0,0 @@
---
id: fileview.plugin.concept
title: fileview 插件元信息
type: concept
feature: fileview
scope: admin
locale: zh
aliases:
- fileview 插件
- kkfileview 插件
- 安装文件预览
- 文件预览插件版本
- 预览插件多大
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- 未安装 fileview 插件时PDF/Office 等文件点击后会报错或下载,无法在线预览
- 主程序不内置 kkfileview本插件是唯一来源
- 不能离线安装到不联网的环境(需访问应用市场镜像源)
last_verified: v1.7.90
---
# fileview 插件元信息
## 定义
文件在线预览由 `fileview` 插件提供(应用市场 app id 为 `fileview`,当前主版本 4.4.0,基于开源 kkfileview 引擎)。主程序在用户点击文件时判断扩展名,若属于 fileview 范畴则 301 跳转到 `fileview/onlinePreview?url=<base64>`,由 fileview 容器渲染。
## 关键属性
- **作者**社区维护Community上游 https://kkview.cn/
- **分类**:微应用(不在管理员应用区,但行为更像「基础设施」——不直接出现在「应用中心」用户菜单,由文件页自动触发)
- **包大小**:约 630MB含 LibreOffice + 各类转码工具)
- **运行形态**:独立 Docker 容器,对接主程序 nginx 上的 `/fileview/` 反代
- **渲染方式**:服务器侧用 LibreOffice 把 docx/pptx 转 PDF 再推到浏览器;纯 PDF 直接 PDF.js 渲染;图片格式化预览
- **跨设备**:桌面端、移动端均能预览
## 安装与启用
1. 在应用市场管理员入口搜索「FileView」或「文件预览」
2. 点击安装,等待镜像下载(约 630MB按「安装日志」判断进度
3. 安装完成后插件自动启用,所有未被主程序原生预览覆盖的文件点击后会自动用 fileview 渲染
## 卸载影响
- 卸载后点击 PDF/Office 等文件会失败(路径仍指向 fileview 但容器不存在)
- 重装后自动恢复
## 与 OnlyOffice 共存
- 同时装了 office 和 fileviewWord/Excel/PPT 优先走 OnlyOffice 编辑器(可编辑)
- 只装 fileviewWord/Excel/PPT 只能用 fileview 只读预览
- 只装 officefileview 才能预览的格式(如 PDF、Visio、CAD 等)无法在线预览
## 相关
- 是什么:[[fileview.concept]]
- 支持的文件类型:[[fileview.supported.concept]]

View File

@ -1,61 +0,0 @@
---
id: fileview.supported.concept
title: fileview 支持的文件类型
type: concept
feature: fileview
scope: end-user
locale: zh
aliases:
- fileview 支持什么格式
- 哪些文件能在线预览
- DooTask 预览的格式
- 能不能预览 PDF
- 能不能预览 CAD
- 预览支持的扩展名
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 fileview 插件
negative:
- 加密/密码保护的 Office 文档预览失败fileview 解不开)
- 超大文件(>100MB预览很慢甚至超时
- 不能在预览页里编辑/批注
last_verified: v1.7.90
---
# fileview 支持的文件类型
## 定义
fileview 插件基于开源 kkfileview 引擎,可在线预览 30+ 种文件格式。主程序对扩展名做粗分流:图片、代码文本、视频音频走主程序自带能力;其余几乎全部交给 fileview。
## 主要支持的格式分类
- **PDF**pdf
- **Word 系**doc, docx, dot, dotx, odt, ott, rtf
- **Excel 系**xls, xlsx, xlsm, xlt, xltx, ods, ots, csv, tsv
- **PowerPoint 系**ppt, pptx, pps, ppsx, pot, potx, odp, otp
- **WPS 系**wps, et, dps与 Office 同一套转码路径)
- **OpenDocument 全系**odt/ods/odp/ott/ots/otp 等
- **流程图 / 矢量**vsd, vsdxVisiodrawio 文件由 drawio 插件直接打开不走 fileview
- **CAD**dwg
- **3D**obj, stl
- **电子书**epub, mobi
- **压缩包**zip, rar, 7z, tar, gz展开目录树预览
- **邮件/日历**eml, ics
- **代码(大文件兜底)**:当代码文本 > 2MB 主程序不再内嵌渲染,可由 fileview 兜底
## 主程序不走 fileview 的格式
- 图片jpg, jpeg, webp, png, gif, bmp主程序内置渲染
- 视频/音频mp3, wav, mp4, flv 等(内置播放器)
- 代码/文本 ≤ 2MB内嵌 AceEditor
- 思维导图mind→ minder 插件
- 流程图drawio→ drawio 插件
- Word/Excel/PPT 若装了 OnlyOffice → 走 OnlyOffice 编辑器(可编辑)
## 不支持
- 加密 / 密码保护的 Office 文档无法预览
- 不保证体积过大(数百 MB 起)的文件能正常预览(可能超时或加载缓慢)
- 不能在预览页里编辑fileview 只读)
## 相关
- 插件元信息:[[fileview.plugin.concept]]
- 是什么:[[fileview.concept]]

View File

@ -1,62 +0,0 @@
---
id: kpi.concept
title: KPI 绩效考核是什么
type: concept
feature: kpi
scope: end-user
locale: zh
aliases:
- KPI
- 绩效
- 绩效考核
- 绩效管理
- 员工评估
- Key Performance Indicator
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 kpi 插件
negative:
- KPI 不是 OKR与 OKR 在 DooTask 中是两个独立插件
- KPI 不是主程序内置功能,未装插件时不可用
- KPI 用户角色与 DooTask 系统角色不完全等价(详见正文)
last_verified: v1.7.90
---
# KPI 绩效考核是什么
## 定义
KPIKey Performance Indicator关键绩效指标在 DooTask 中由独立插件 `community_kuaifan_kpi` 提供是面向企业和组织的现代化绩效考核管理系统。它支持创建考核任务、按模板录入指标评分、邀请同事评分、HR 审核与异议处理,让多角色协作完成员工绩效评估。
## 在 DooTask 中的形态
- 通过应用市场安装的社区插件(基于 Next.js + Go
- 与 DooTask 用户体系打通:用户信息、部门信息自动同步
- 与 DooTask 主程序作为应用插件集成,菜单挂在「应用」下
## 用户角色
KPI 内部有自己独立的三级角色(与 DooTask 系统角色不完全等价):
- **employee普通员工**:查看 / 填写自己的考核、提交异议、参与邀请评分
- **manager部门主管**:员工的全部能力 + 评估下属、导出数据
- **hrHR 管理员)**:完整系统权限,管理部门 / 员工 / 模板 / 规则 / 异议
## 关键能力
- **考核管理**:创建、填写、管理绩效考核
- **邀请评分**:多角度 360 度评价(详见 [[kpi.create.howto]]
- **异议处理**员工可申诉HR 审核调整得分
- **统计分析**:数据图表与报表,支持 Excel 导出
- **KPI 模板**HR 维护通用模板供考核复用
## KPI 与 OKR 的区别
- **KPI**:直接考核指标,与绩效 / 薪酬绑定,偏重「不能丢分」
- **OKR**:目标管理工具,鼓励挑战性目标,与考核解耦
## 不支持
- 不直接对接 DooTask 任务完成情况自动算绩效
- 不支持脱离 DooTask 单独登录使用
## 相关
- 插件元信息:[[kpi.plugin.concept]]
- 入口在哪:[[kpi.entry.menu-map]]
- 创建考核:[[kpi.create.howto]]
- 评分机制:[[kpi.scoring.concept]]

View File

@ -1,60 +0,0 @@
---
id: kpi.plugin.concept
title: KPI 插件元信息
type: concept
feature: kpi
scope: end-user
locale: zh
aliases:
- KPI 插件
- kpi 怎么装
- 绩效插件
- 绩效考核插件
- community_kuaifan_kpi
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- KPI 不是主程序内置功能,未装插件时入口不会出现
- 插件升级不通过 git pull需要在应用市场更新
- 主程序版本必须高于 1.4.67,否则插件无法安装
last_verified: v1.7.90
---
# KPI 插件元信息
## 定义
KPI 绩效考核在 DooTask 中由社区插件提供,应用市场 app id 为 `community_kuaifan_kpi`(当前版本 0.1.9feature 短名 `kpi`。主程序不内置任何 KPI 代码,所有绩效逻辑都跑在独立 Docker 容器中,作为应用插件挂载到 DooTask 界面。
## 关键属性
- **作者**DooTask 官方
- **要求**:主程序版本 > 1.4.67(依赖新 API 能力)
- **运行形态**:单个 Docker 容器(镜像 `dootask/kpi:<version>`
- **数据存储**:独立 SQLite 数据库,本地卷 `kpi_data` 挂载到 `/web/db`,不入主库
- **菜单注入**:安装后在「应用中心」注册「绩效考核」入口
- **重启策略**`unless-stopped`,主机重启容器自动恢复
## 用户生命周期钩子
插件订阅了 DooTask 的用户事件,自动维护 KPI 内部用户:
- `user_onboard`DooTask 创建用户时,自动在 KPI 内建号
- 部门不存在则自动创建该部门
- DooTask 管理员自动设为 HR 角色
- 部门负责人自动设为 manager 角色
- 其余设为 employee 角色
- `user_offboard`DooTask 删除用户时KPI 同步清理
## 信息同步规则
用户登录 KPI 时:
- 自动更新姓名、职位
- **角色保持不变**(不会因为 DooTask 角色变化而重新分配 KPI 角色)
## 不支持
- 不能离线安装到不联网的环境(需访问应用市场镜像源)
- 不能在主程序 < 1.4.67 的环境上安装
## 相关
- 是什么:[[kpi.concept]]
- 入口在哪:[[kpi.entry.menu-map]]
- 评分机制:[[kpi.scoring.concept]]

View File

@ -1,73 +0,0 @@
---
id: kpi.scoring.concept
title: KPI 评分机制与权重
type: concept
feature: kpi
scope: end-user
locale: zh
aliases:
- KPI 怎么算分
- 绩效权重
- 自评权重
- 上级评分
- 邀请评分权重
- 绩效规则
- 最终得分怎么来的
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 kpi 插件
negative:
- 仅 HR 管理员可以配置绩效规则
- 权重百分比合计必须为 100%,否则保存不通过
- 关闭绩效规则开关后,系统回退到默认评分方式
- 配置修改后立即生效,仅影响后续新发起的考核
last_verified: v1.7.90
---
# KPI 评分机制与权重
## 定义
KPI 插件的「绩效规则」用于配置不同评分来源在最终得分中的权重比例。系统会根据规则把自评、上级评分、邀请评分按比例加权,自动算出员工的最终绩效得分。
## 评分来源
一次考核可能涉及最多三种评分来源:
- **自评**:员工对照模板给自己打分
- **上级评分**:直属主管打分
- **邀请评分**HR 邀请的第三方人员打分(可选环节,仅在 HR 发起邀请后生效)
## 配置场景
绩效规则按是否有邀请评分分为两套权重配置:
- **无邀请评分场景**
- 自评权重 + 上级评分权重 = 100%
- **有邀请评分场景**
- 自评权重 + 邀请评分权重 + 上级评分权重 = 100%
## 配置流程
1. HR 进入 KPI 的「绩效规则」配置页
2. 打开绩效规则开关,规则生效
3. 按公司制度分别设置两种场景下各来源的权重百分比
4. 保存后立即生效,影响后续新发起的考核
5. 若关闭开关,系统使用默认评分方式
## HR 审核环节
- 主管评估、邀请评分完成后HR 在「审核」环节查看汇总结果
- 系统按绩效规则自动算出最终得分HR 可手动调整
- 员工在「待确认」状态查看最终分有异议可申诉HR 审核后再调分
## 异议处理对得分的影响
- 员工提交异议后考核状态变为「异议处理中」
- HR 可填写处理原因并调整最终得分
- 处理后员工需重新确认;如仍有异议可再次提交(每轮异议都需 HR 重新处理)
## 不支持
- 不支持非 HR 角色配置绩效规则
- 不支持单条考核临时改权重(只能改全局规则)
- 不支持权重为负值或合计不等于 100%
## 相关
- KPI 是什么:[[kpi.concept]]
- 创建考核:[[kpi.create.howto]]
- 入口在哪:[[kpi.entry.menu-map]]

View File

@ -1,55 +0,0 @@
---
id: memos.concept
title: Memos 是什么
type: concept
feature: memos
scope: end-user
locale: zh
aliases:
- Memos
- 速记
- 笔记应用
- 个人笔记
- 想法记录
- 碎片笔记
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 memos 插件
negative:
- Memos 不是主程序内置功能,未装插件时不可用
- Memos 默认走 SQLite 本地存储,不接 DooTask 主库
- 不支持游客 / 未登录访问
last_verified: v1.7.90
---
# Memos 是什么
## 定义
Memos笔记 / 速记)是一款隐私优先、轻量级的开源笔记服务(开源项目 [usememos.com](https://www.usememos.com)),在 DooTask 中以独立插件形式集成主要用来快速记录想法、待办、链接、代码片段等碎片化内容。每条记录就是一条「memo」时间倒序排列在时间线上。
## 在 DooTask 中的形态
- 通过应用市场安装的社区插件,与主程序同源、共用 TLS
- 走主程序 nginx 子路径 `/apps/memos/` 反向代理,用户无需额外登录
- 数据自托管,使用 SQLite存放于应用目录 `data/memos`
## 关键特性
- **轻量速记**:以时间线方式记录碎片想法,类似 Twitter/微博风格
- **隐私优先**:数据完全自托管,不上传第三方
- **单点登录**DooTask 登录态自动同步,免输密码
- **标签 / 分类**:支持 `#标签` 语法分类整理(详见 [[memos.tag.concept]]
## 适用场景
- 工作日志、灵感速记
- 临时收藏链接 / 代码片段
- 个人学习笔记 / 读书摘录
- 团队不强协作场景下的轻量笔记
## 不支持
- 不替代正式文档(如需协作文档请用项目内文档)
- Memos 不直接与任务 / 项目数据互通
## 相关
- 插件元信息:[[memos.plugin.concept]]
- 入口在哪:[[memos.entry.menu-map]]
- 怎么写一条:[[memos.create.howto]]

View File

@ -1,52 +0,0 @@
---
id: memos.plugin.concept
title: Memos 插件元信息
type: concept
feature: memos
scope: end-user
locale: zh
aliases:
- Memos 插件
- memos 怎么装
- memos 应用市场
- 笔记插件
- community_kuaifan_memos
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- Memos 不是主程序内置功能,未装插件时入口不会出现
- 插件升级不通过 git pull需要在应用市场更新
- 插件不能离线安装到不联网的环境
last_verified: v1.7.90
---
# Memos 插件元信息
## 定义
Memos 在 DooTask 中由社区插件提供,应用市场 app id 为 `community_kuaifan_memos`(当前版本 0.29.0feature 短名 `memos`。主程序不内置任何 Memos 代码,所有笔记逻辑都跑在独立容器中,通过 nginx 反向代理 `/apps/memos/` 子路径挂载到 DooTask 界面。
## 关键属性
- **作者**DooTask 官方(基于开源项目 usememos/memos
- **运行形态**:两个 Docker 容器
- `memos-server`:自构建 Memos 镜像(`dootask/memos-server:0.29.0`),前端打补丁支持子路径
- `memos-proxy`:鉴权代理(`dootask/memos:<version>`),校验 DooTask 用户令牌、自动建号 / 免密登录
- **数据存储**SQLite本地卷 `memos-data` 挂载到 `/var/opt/memos`,不入主库
- **菜单注入**安装后在「应用中心」注册「Memos 笔记」入口
- **会话有效期**:访问令牌过期后通过 `memos_refresh` cookie 自动续期,最长 30 天
## 安装配置项
- **管理员**:在安装界面选择若干 DooTask 用户作为 Memos 管理员,其余用户以普通成员身份登录
- **内部密钥**:用于派生账号密码与签名会话,安装后请勿修改
## 单点登录机制
- 用户打开插件时,代理自动在 Memos 内建号、用确定性密码登录
- 屏蔽 Memos 原生的直接登录与自助注册接口(防止绕过 DooTask 鉴权)
## 不支持
- 不能用 Memos 原生账号密码登录(仅支持 DooTask SSO
- 不能选择不安装 `memos-proxy`(鉴权必经路径)
## 相关
- 是什么:[[memos.concept]]
- 入口在哪:[[memos.entry.menu-map]]

View File

@ -1,57 +0,0 @@
---
id: memos.tag.concept
title: Memos 标签与分类
type: concept
feature: memos
scope: end-user
locale: zh
aliases:
- Memos 标签
- memos 怎么分类
- 笔记标签
- 笔记分类
- 标签筛选
- "#标签"
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 memos 插件
negative:
- 标签是每个用户私有的(不与其他 DooTask 用户共用)
- 标签不与 DooTask 主程序的任务标签互通
last_verified: v1.7.90
---
# Memos 标签与分类
## 定义
Memos 没有独立的「分类」字段,靠 `#标签` 语法在 memo 正文中内联标记。任何写在 `#xxx` 形式的词都会被识别为标签,自动聚合到侧边栏的标签列表,便于后续筛选检索。
## 关键属性
- **写法**:在内容里直接写 `#项目A` `#读书笔记`,可一条 memo 多个标签
- **嵌套**:支持斜杠分层,例如 `#工作/会议纪要`,侧栏会折叠展示
- **私有**:每个 Memos 账号的标签彼此隔离(每个 DooTask 用户在 Memos 内是独立账号)
- **聚合方式**Memos 自动扫描所有 memo 正文,无需手动维护「标签库」
## 使用方式
- **添加**:写 memo 时在内容里直接打 `#标签名`,保存即生效
- **筛选**:点击侧栏中对应标签,时间线只显示带该标签的 memo
- **删除**:把所有 memo 里这个 `#标签` 的字符删掉,标签自动消失(无独立删除按钮)
## 与可见性的关系
- 标签本身只是文本标记,不影响 memo 的可见性(私有 / 工作区 / 公开)
- 想限定某类笔记只自己可见,应改对应 memo 的可见性,而不是靠标签
## 适用场景
- 按项目 / 主题 / 周期分组浏览
- 给读书摘录 / 灵感速记打主题
- 搭配搜索定位历史笔记
## 不支持
- 不能改某个标签的名字(要重命名只能逐条编辑替换原文)
- 不能给标签设颜色或图标
- 不能从 DooTask 主程序任务的标签自动同步过来
## 相关
- Memos 是什么:[[memos.concept]]
- 写一条 memo[[memos.create.howto]]

View File

@ -27,14 +27,14 @@ last_verified: v1.7.90
DooTask 应用市场提供一组官方与社区维护的微应用。下面列的是较常见的几类,实际能在应用中心看到的微应用取决于本实例已安装了哪些,参考服务器 `docker/appstore/apps/` 目录即可知。
## 常见微应用
- **OKR**id `okr`)— 目标 + 关键结果管理,参考 [[okr.concept]]
- **审批中心**id `approve`)— 流程审批,参考 [[approve.concept]]
- **OKR**id `okr`)— 目标 + 关键结果管理
- **审批中心**id `approve`)— 流程审批
- **思维导图 Minder**id `minder`)— 文件类型 `.km`
- **流程图 Drawio**id `drawio`)— 文件类型 `.drawio`
- **OnlyOffice**id `office`)— Word / Excel / PPT 在线编辑
- **文件预览 fileview**id `fileview`)— PDF / 图片 / 文档预览渲染
- **人脸识别签到**id `face`)— 配合签到使用
- **AI 助手**id `ai`)— 见 [[ai-assistant.entry.howto]]
- **AI 助手**id `ai`)— 浮窗式智能助手
- **Memos 笔记**(社区 `community_kuaifan_memos`)— 个人记事本
- **KPI**(社区 `community_kuaifan_kpi`)— 绩效考核
- **Manticore 搜索**id `manticore`)— 全文搜索引擎

View File

@ -1,50 +0,0 @@
---
id: minder.collaboration.concept
title: 思维导图是否支持多人协作编辑
type: concept
feature: minder
scope: end-user
locale: zh
aliases:
- 思维导图协作
- 思维导图多人编辑
- 脑图共享编辑
- 思维导图能不能一起改
- minder 实时同步
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 minder 插件
negative:
- 同一张 mind 文件同一时间不支持多人实时同步编辑,与 OnlyOffice 不同
- 多人同时打开并保存可能导致后保存方覆盖前保存方
- 不支持节点级别的细粒度评论或讨论
last_verified: v1.7.90
---
# 思维导图是否支持多人协作编辑
## 定义
DooTask 思维导图minder 插件)以**单人编辑 + 多人查看**模式运作。文件内容存到 DooTask 文件系统,所有有权限的成员都能打开看到当前最新版本,但同一时间多人编辑保存会出现「后写覆盖前写」。
## 关键属性
- **多人可见**:所有对文件有读权限的成员都能打开预览
- **保存机制**:编辑器内修改后由前端发起保存请求,整张图作为一个 JSON 文件覆盖式保存
- **没有实时同步**:与 OnlyOffice[[office.collaboration.concept]])不同,思维导图不通过 WebSocket 推送其他人的实时改动
- **冲突表现**A、B 同时打开编辑A 先保存B 后保存——最终内容只剩 B 的版本A 的改动丢失
- **历史版本**:可借助 DooTask 文件版本历史回滚到之前的快照
## 推荐协作模式
- 同一时间由一人改,其他人通过群聊/讨论沟通后再轮换编辑
- 大型导图按子分支拆成多张文件,分人维护
- 改完后通过文件「发送」/「链接」/「共享」分享给团队
- 误覆盖可在文件详情 →「历史版本」中恢复
## 与其他场景对比
- **drawio 流程图**:同样是单人编辑,多人同时编辑也会出现覆盖
- **OnlyOffice Word/Excel/PPT**:自带多人实时协作,多端同时编辑会合并
- **DooTask 在线文档document**:基于富文本编辑器,亦不支持多人实时
## 相关
- 是什么:[[minder.concept]]
- OnlyOffice 协作能力对比:[[office.collaboration.concept]]

View File

@ -1,45 +0,0 @@
---
id: minder.concept
title: 思维导图minder是什么
type: concept
feature: minder
scope: end-user
locale: zh
aliases:
- 思维导图
- 脑图
- mind map
- minder 是什么
- DooTask 思维导图
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 minder 插件
negative:
- 思维导图功能不是主程序内置,未安装 minder 插件无法新建 `mind` 类型文件
- 不能在思维导图节点上直接附加 DooTask 任务/评论(节点只是图形元素)
- 节点数量过多(数千节点)可能影响渲染性能
last_verified: v1.7.90
---
# 思维导图minder是什么
## 定义
思维导图是 DooTask 文件系统中的一种文件类型(`type=mind`),用于以放射状结构表达想法、计划、知识结构。它由独立的 minder 插件提供编辑器,主程序通过 iframe 嵌入插件页面,文件内容存到 DooTask 自己的文件库里。
## 关键属性
- **文件类型**`mind`(区别于 `document` 文本、`drawio` 图表、`word/excel/ppt`
- **存储位置**:与其他文件一样存在 DooTask 文件系统(个人文件 / 项目文件 / 共享)
- **编辑器**:嵌入的 KityMinder 风格编辑器,支持多种结构(默认、组织结构、文件树、右展开、鱼骨图、天盘)和多套主题
- **操作支持**:拖拽、缩放、节点折叠/展开、键盘快捷键、导出图片
- **历史版本**:随 DooTask 文件历史一同保存
## 与其他文件类型的关系
- **vs drawio**drawio 适合流程图/UML/网络拓扑等任意图形;思维导图专注放射状层级结构,节点编辑更轻
- **vs 文档document**:文档是富文本/Markdown思维导图是图形化结构
## 相关
- 插件元信息:[[minder.plugin.concept]]
- 创建一张思维导图:[[minder.create.howto]]
- 入口在哪:[[minder.entry.menu-map]]
- 是否支持协作编辑:[[minder.collaboration.concept]]

View File

@ -1,48 +0,0 @@
---
id: minder.plugin.concept
title: minder 插件元信息
type: concept
feature: minder
scope: admin
locale: zh
aliases:
- minder 插件
- 思维导图插件
- 思维导图怎么安装
- 安装 minder
- minder 插件版本
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- 主程序不内置思维导图编辑器,未装插件时新建文件菜单不会显示「思维导图」
- 插件升级不通过 git pull需要在应用市场更新
- 不能离线安装到不联网的环境(需访问应用市场镜像源)
last_verified: v1.7.90
---
# minder 插件元信息
## 定义
思维导图能力由独立插件 `minder` 提供(应用市场 app id 为 `minder`,当前主版本 0.1.3)。主程序通过 iframe 内嵌插件提供的编辑器页面,文件内容仍保存在 DooTask 主库;卸载插件后已有 `mind` 文件无法继续编辑/预览,但文件本身不会被删除。
## 关键属性
- **作者**DooTask 官方
- **分类**:微应用(在「应用中心」中列出,作为微应用菜单项;不在管理员应用区)
- **包大小**:约 20MB安装较慢请通过应用市场的「安装日志」查看进度
- **运行形态**:随主程序部署的静态资源 + iframe 嵌入,无独立后端进程
- **数据存储**:思维导图内容存到 DooTask 主程序文件表(`type=mind`),不在插件容器单独存
- **触发场景**:用户在文件页「新建 → 思维导图」时由主程序加载插件 iframe
## 安装与启用
1. 在应用市场管理员入口搜索「Minder」或「思维导图」
2. 点击安装,等待资源加载(约 20MB
3. 安装完成后插件自动启用,文件新建菜单立即出现「思维导图」选项
## 卸载影响
- 卸载后菜单消失,原有 `mind` 文件保留在文件库中但无法打开
- 重新安装后旧文件继续可用
## 相关
- 是什么:[[minder.concept]]
- 入口在哪:[[minder.entry.menu-map]]

View File

@ -1,56 +0,0 @@
---
id: office.collaboration.concept
title: OnlyOffice 多人协作编辑
type: concept
feature: office
scope: end-user
locale: zh
aliases:
- office 协作
- Word 一起编辑
- 多人同时编辑文档
- 在线协作 Excel
- 协同编辑 PPT
- OnlyOffice 协作
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 officeOnlyOffice插件
- 协作各方对该文件均有「编辑」权限
negative:
- 与 minder[[minder.collaboration.concept]])和 drawio 不同OnlyOffice 才提供真正的多人实时编辑
- 同一文件大规模并发(数十人)依赖 Document Server 资源,组织内建议 ≤ 10 人同时改
- 离线编辑不支持,没有「断网继续编辑、上线合并」的模式
last_verified: v1.7.90
---
# OnlyOffice 多人协作编辑
## 定义
DooTask 在线 Word/Excel/PPToffice 插件)原生支持**多人实时协作编辑**。多人同时打开同一文件时OnlyOffice Document Server 通过 WebSocket 推送他人光标和实时改动,最终内容由 Document Server 合并后回写到 DooTask 文件库,不存在「后保存覆盖前保存」的问题。
## 关键属性
- **会话识别**:主程序用 `documentKey` 标识同一份文档的协作会话,所有人加入同一 key 即进入同一编辑会话
- **实时光标**:能看到其他人当前在哪个段落/单元格,配色按用户区分
- **冲突处理**:编辑级别合并(不是文件级覆盖),单元格/字符级冲突由 OnlyOffice 自动协商
- **保存触发**:所有人都离开编辑器后由 Document Server 把最终版本写回 DooTask 文件表
- **历史版本**:随 DooTask 文件版本保留,可回溯
## 编辑模式
OnlyOffice 提供两种协作模式:
- **快速模式**:所有改动实时显示给所有人(默认)
- **严格模式**:自己的改动暂存,需手动点「保存」才同步给他人——适合需要审稿的场景,在 OnlyOffice 编辑器内切换
## 权限组合
- A、B 同为编辑权限:均可实时改
- A 编辑、B 只读B 仅看,无法输入
- A 关闭、B 仍开着B 单人继续A 再打开时进入同一会话
## 与其他文件类型的对比
- **vs DooTask 内置 document**document 是富文本/Markdown 编辑器,**不支持**多人实时
- **vs minder 思维导图**:思维导图是单人编辑,多人同时保存会覆盖
- **vs drawio 流程图**:同样是单人编辑,多人同时保存会覆盖
## 相关
- 是什么:[[office.concept]]
- 插件元信息:[[office.plugin.concept]]

View File

@ -1,48 +0,0 @@
---
id: office.concept
title: 在线文档OnlyOffice是什么
type: concept
feature: office
scope: end-user
locale: zh
aliases:
- 在线文档
- 在线 Word
- 在线 Excel
- 在线 PPT
- OnlyOffice
- office 编辑
- 怎么在线编辑
related_tools: []
related_pages: [file]
prerequisites:
- 应用市场已安装 officeOnlyOffice插件
negative:
- 在线编辑能力不是主程序内置,未装 OnlyOffice 插件时打开 Word/Excel/PPT 只能调 fileview 预览(详见 [[fileview.concept]]),不能编辑
- 单文档大小过大(数十 MB 起)打开很慢,建议拆分
- 不支持把 docx 直接转成 DooTask 自带的 `document` 文件类型
last_verified: v1.7.90
---
# 在线文档OnlyOffice是什么
## 定义
DooTask 通过 OnlyOffice 插件提供 Word/Excel/PowerPoint 文件的**在线编辑与多人实时协作**。文件存在 DooTask 文件系统(文件类型分别为 `word`/`excel`/`ppt`),编辑器以 iframe 形式嵌入 OnlyOffice Document Server 提供的页面,多人同时打开同一文件时能看到他人光标和实时改动。
## 关键属性
- **文件类型**`word`doc/docx/dot/dotx/odt/ott/rtf`excel`xls/xlsx/xlsm/xlt/xltx/ods/ots/csv/tsv`ppt`ppt/pptx/pps/ppsx/pot/potx/odp/otp
- **存储位置**DooTask 文件系统(个人文件 / 项目文件 / 共享)
- **编辑能力**:直接在浏览器编辑文档,与桌面端 Office 体验接近
- **实时协作**:多人同时打开会自动建立协作会话,详见 [[office.collaboration.concept]]
- **历史版本**:随 DooTask 文件历史一同保存
## 与其他文件类型的关系
- **vs documentMarkdown/富文本)**DooTask 自带的 `document` 文件是轻量富文本,无法编辑真正的 docx 二进制
- **vs fileview 预览**fileview 提供只读的多格式文件预览(包括 office 文件),不能编辑
- **vs minder / drawio**:那些是图形文件,无法用 OnlyOffice 打开
## 相关
- 插件元信息:[[office.plugin.concept]]
- 创建在线文档:[[office.create.howto]]
- 多人协作能力:[[office.collaboration.concept]]
- 入口在哪:[[office.entry.menu-map]]

View File

@ -1,54 +0,0 @@
---
id: office.plugin.concept
title: OnlyOffice 插件元信息
type: concept
feature: office
scope: admin
locale: zh
aliases:
- OnlyOffice 插件
- office 插件
- 安装 OnlyOffice
- 安装在线文档
- onlyoffice 版本
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- 主程序不内置 docx/xlsx/pptx 在线编辑,未装插件时双击 Word/Excel/PPT 只能调 fileview 预览
- 插件体积约 1.3GB,下载较慢,需要稳定网络与充足磁盘
- 不能离线安装到不联网的环境(需访问应用市场镜像源)
last_verified: v1.7.90
---
# OnlyOffice 插件元信息
## 定义
在线 Word/Excel/PPT 编辑由 `office` 插件提供(应用市场 app id 为 `office`,包名 OnlyOffice当前主版本 9.4.0)。插件包含 OnlyOffice Document Server 完整容器;主程序通过 iframe 嵌入 Document Server 的编辑器页面,借助 OnlyOffice 内置 WebSocket 实现多人实时协作。
## 关键属性
- **作者**社区维护Community上游 https://www.onlyoffice.com/
- **分类**:微应用(不在管理员应用区)
- **包大小**:约 1.3GB(含 Document Server下载慢按「安装日志」判断进度
- **运行形态**:独立 Docker 容器OnlyOffice Document Server
- **数据存储**:编辑结果由 OnlyOffice 回写到 DooTask 文件表,文件本体存到主程序的文件系统,不在 Document Server 长期持久化
- **协议**:内部通过 JWT 令牌与 OnlyOffice 通信,主程序签发 documentKey 标识文件版本
## 安装与启用
1. 在应用市场管理员入口搜索「OnlyOffice」或「在线文档」
2. 点击安装,等待镜像下载(约 1.3GB,请通过「安装日志」查看进度)
3. 安装完成后插件自动启用文件新建菜单立即出现「Word / Excel / PPT」选项
4. 上传/打开已有 docx/xlsx/pptx 文件即可在线编辑
## 卸载影响
- 卸载后文件库中的 Word/Excel/PPT 文件保留,但无法在线编辑,回退到 fileview 预览(若未装 fileview 则无法预览)
- 重装后所有文件自动恢复在线编辑能力
## 已知限制
- 部署在公网时建议为 Document Server 配置 HTTPS否则浏览器可能拦截 WebSocket
- 同一文件大量并发协作(数十人)需要更强的 Document Server 资源
## 相关
- 是什么:[[office.concept]]
- 多人协作机制:[[office.collaboration.concept]]
- 入口在哪:[[office.entry.menu-map]]

View File

@ -1,57 +0,0 @@
---
id: okr.cycle.concept
title: OKR 周期
type: concept
feature: okr
scope: end-user
locale: zh
aliases:
- OKR 周期
- 季度 OKR
- Q1 Q2 Q3 Q4
- OKR 时间段
- OKR 多久一轮
- 年度 OKR
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 okr 插件
negative:
- OKR 周期非全平台统一,由公司 / 团队按内部约定决定
- 周期内频繁改 O 会降低聚焦度,不建议中途大改
last_verified: v1.7.90
---
# OKR 周期
## 定义
OKR 周期是一组 OKR 的有效时间盒。每个周期内设定一批 O 与 KR周期末统一评审打分下一周期重新设定。常见的周期长度有季度Q1/Q2/Q3/Q4和年度部分团队也会用半年或月度。
## 常见周期模式
- **季度 OKR**:每 3 个月一轮,最主流,节奏适中
- **年度 OKR**:通常承载战略级目标,跨度大、调整少
- **半年 / 双月**:折中节奏,按业务变化速度选
- **公司 / 团队 / 个人多层周期**:上层周期可以更长,下层周期更短
## 周期内三个阶段
1. **设定期**:周期开始前 1-2 周写 O 和 KR与上下级对齐
2. **执行期**:周期内推进,按节奏更新进度(参见 [[okr.update-progress.howto]]
3. **评审期**:周期末打分复盘(参见 [[okr.review.howto]]
## 在 DooTask OKR 插件中的体现
- 创建 OKR 时需指定所属周期
- 「我的 OKR」、「OKR 结果」按周期筛选展示
- 历史周期数据保留,可回看复盘
## 周期切换注意
- 周期未结束前不要急着开新周期 OKR
- 评审完成后再开下一周期,避免新旧周期混淆
- 跨周期延续的目标可在新周期重新写一遍,不要简单复制
## 不支持
- 周期粒度由团队约定OKR 插件不强制规定季度还是年度
- 周期内频繁改 O 内容会影响聚焦,不推荐
## 相关
- OKR 总览:[[okr.concept]]
- 评审打分:[[okr.review.howto]]

View File

@ -1,59 +0,0 @@
---
id: okr.kr.concept
title: Key ResultKR关键结果是什么
type: concept
feature: okr
scope: end-user
locale: zh
aliases:
- KR
- Key Result
- 关键结果
- OKR 的 KR
- 怎么写 KR
- KR 怎么量化
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 okr 插件
negative:
- KR 必须可量化(数字 / 完成度 / 状态),不能写成模糊描述
- 单个 O 的 KR 数量建议 2-5 个,不宜过多
last_verified: v1.7.90
---
# Key ResultKR关键结果是什么
## 定义
Key Result缩写 KR是 OKR 方法论中衡量 Objective 是否达成的「关键结果」。KR 必须可量化(带数字 / 完成度 / 是否完成的二值状态),周期内可以更新进度,周期末给出 0-100% 的最终得分。
## 关键属性
- **可量化**:必须能用数字、百分比、完成状态来衡量
- **结果导向**:描述达成的结果,而不是过程动作
- **可追踪**:周期内可以定期更新当前进度
- **挑战性**:好的 KR 让人觉得「拼一拼能到 70%」,而不是稳拿 100%
## 好 KR 的写法
- 量化模板:动词 + 指标 + 当前值→目标值 + 时限
- 例:「将新用户首日留存率从 35% 提升到 50%」
- 例:「完成 3 场行业大会的 keynote 分享」
- 例:「上线 v2.0 并通过验收」
## 反例
- 「提升满意度」——没数字,无法判断是否达成
- 「努力做好客户支持」——描述态度而非结果
- 「写 50 篇日报」——是过程指标,不是结果
## 进度与打分
- 周期内:把 KR 的当前实际值更新进系统,得到 0-100% 进度
- 周期末:根据最终值给 KR 打分(参见 [[okr.review.howto]]
- 一个 O 的总分常按 KR 加权平均得出
## 与 O 的关系
- KR 是 O 的衡量手段;没有 O 的 KR 是孤立指标
- 一个 O 的所有 KR 全部达成 ≈ O 达成;多数达成可视为部分达成
## 相关
- O 的概念:[[okr.objective.concept]]
- 更新进度:[[okr.update-progress.howto]]
- 周期评审:[[okr.review.howto]]

View File

@ -1,58 +0,0 @@
---
id: okr.objective.concept
title: ObjectiveO目标是什么
type: concept
feature: okr
scope: end-user
locale: zh
aliases:
- O 是什么
- Objective
- 目标
- OKR 的 O
- 怎么写 O
- 目标怎么定
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 okr 插件
negative:
- O 本身不携带数字指标,量化交给 KR
- 一个 O 不建议拆出超过 5 个 KR否则失焦
last_verified: v1.7.90
---
# ObjectiveO目标是什么
## 定义
Objective缩写 O是 OKR 方法论中的「目标」一句话回答「我们这个周期想达成什么」。O 是定性的、激励性的方向描述,本身不带具体数字,量化由 KR 承担。
## 关键属性
- **定性**:用语言描述方向,不直接写百分比 / 数量
- **聚焦**:单个用户或团队每周期通常只设 3-5 个 O
- **激励性**:鼓励挑战性目标,能让团队达到 60-70% 就算成功
- **可记忆**:一句话能讲清楚,不堆砌定语
## 好 O 的特征
- 短:一句话讲完
- 有方向感:表达「往哪里走」
- 与战略对齐:能回答「为什么做这件事」
- 时间盒匹配周期:在一个周期(季度 / 年度)内能产出结果
## 反例
- 「提升用户满意度 20%」——这是 KR不是 OO 不带数字)
- 「做完所有任务」——太空,没有方向
- 「研发一个新功能」——粒度太细,更像任务
## 与 KR 的关系
- 一个 O 配 2-5 个 KR详见 [[okr.kr.concept]]
- O 描述目的KR 描述衡量;分别承担定性与定量
- 没有 KR 的 O 是空话;没有 O 的 KR 是孤立指标
## 与团队结构的关系
- 个人 O、团队 O、公司 O 可以分层对齐
- 上下级对齐方式见 [[okr.align.howto]]
## 相关
- 怎么创建:[[okr.create.howto]]
- 周期:[[okr.cycle.concept]]

View File

@ -1,56 +0,0 @@
---
id: okr.concept
title: OKR 是什么
type: concept
feature: okr
scope: end-user
locale: zh
aliases:
- OKR
- OKR 是什么
- 目标管理
- Objectives and Key Results
- 目标与关键结果
- OKR 怎么用
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 okr 插件
negative:
- OKR 不是 KPI不直接与绩效或薪酬挂钩
- DooTask 主程序不内置 OKR必须装 okr 插件才能用
last_verified: v1.7.90
---
# OKR 是什么
## 定义
OKRObjectives and Key Results目标与关键结果是一种目标管理方法将「想做成什么」ObjectiveO和「怎么衡量做成了」Key ResultKR分开。一个 O 拆成 2-5 个可量化的 KR周期内逐项更新进度周期末统一打分复盘。
## 在 DooTask 中的形态
OKR 在 DooTask 中以独立插件形式提供appstore 应用 id`okr`),不是主程序内置功能。插件提供:
- 目标设定与分解O + KR
- 关键成果跟踪KR 进度)
- 进度实时更新
- 团队协作与反馈
- 数据可视化展示(管理员可看 OKR 结果分析)
## 关键概念
- **OObjective**:定性的目标,回答「想达成什么」,详见 [[okr.objective.concept]]
- **KRKey Result**:可量化的关键结果,回答「如何衡量达成」,详见 [[okr.kr.concept]]
- **周期Cycle**OKR 通常按季度或年度运行,详见 [[okr.cycle.concept]]
- **对齐Alignment**:个人 / 团队 OKR 关联到上级 OKR详见 [[okr.align.howto]]
## OKR 与 KPI 的区别
- **KPI**:直接考核指标,与绩效 / 薪酬绑定,偏重「不能丢分」
- **OKR**目标管理工具鼓励挑战性目标70% 完成度即合格),与考核解耦
## 适用场景
- 团队希望聚焦少数关键目标
- 跨部门需要对齐战略方向
- 季度 / 年度滚动复盘
## 相关
- 入口在哪:[[okr.entry.menu-map]]
- 怎么创建:[[okr.create.howto]]

View File

@ -1,52 +0,0 @@
---
id: okr.plugin.concept
title: OKR 插件元信息
type: concept
feature: okr
scope: end-user
locale: zh
aliases:
- OKR 插件
- OKR 是不是要装
- okr 应用
- OKR 装多大
- OKR 怎么安装
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- OKR 不是主程序内置功能,未装插件时不可用
- 插件升级不通过 git pull需要在应用市场更新
last_verified: v1.7.90
---
# OKR 插件元信息
## 定义
OKR 在 DooTask 中由独立插件 `okr` 提供(应用市场 app id 为 `okr`,当前主版本 0.5.8)。主程序不内置 OKR 任何代码,所有目标管理逻辑都跑在独立容器里,通过 nginx 反向代理 `/apps/okr/` 路径挂载到 DooTask 界面。
## 关键属性
- **作者**DooTask 官方
- **包大小**:约 15MB安装较慢请通过安装日志查看进度
- **运行形态**:独立 Docker 容器(镜像 `kuaifan/doookr`),通过环境变量复用主程序的数据库
- **菜单注入**安装后自动在「应用中心」注册两个入口OKR 管理 + OKR 结果)
- **数据存储**:与主程序共享同一个 MySQL/MariaDB 实例(独立表前缀由插件管理)
- **要求**:主程序版本 > 1.1.66
## 安装与启用
1. 应用市场搜索「OKR」或「目标管理」
2. 点击安装,等待镜像拉取与容器启动
3. 安装完成后插件自动启用,菜单立即出现,无需重启主程序
4. 默认配置适配大多数场景,可在插件设置中按需调整
## 升级与卸载
- 升级:应用市场看到新版本时点击「更新」
- 卸载:应用市场对应插件 →「卸载」;卸载后菜单消失,业务数据保留在数据库中
## 不支持
- 不能离线安装到不联网的环境(需访问应用市场镜像源)
- 不能选择安装到非 Docker 部署的 DooTask插件依赖容器化
## 相关
- 看不到 / 装不上:[[okr.cannot-install.faq]]
- 入口在哪:[[okr.entry.menu-map]]

View File

@ -1,62 +0,0 @@
---
id: okr.team.concept
title: 团队 OKR 与个人 OKR
type: concept
feature: okr
scope: end-user
locale: zh
aliases:
- 团队 OKR
- 个人 OKR
- 部门 OKR
- 公司 OKR
- OKR 层级
- OKR 分层
related_tools: []
related_pages: [application]
prerequisites:
- 应用市场已安装 okr 插件
negative:
- 团队 OKR 不是个人 OKR 的简单加和
- 个人 OKR 不必把团队 KR 完全分担,可基于职责选择关联
last_verified: v1.7.90
---
# 团队 OKR 与个人 OKR
## 定义
OKR 按主体层级可分为公司 OKR、团队部门OKR、个人 OKR。各层级各有 O 和 KR通过「对齐」建立因果关联形成自上而下的目标树。
## 三个层级的差异
- **公司 OKR**跨部门的战略级方向周期通常更长年度数量少3-5 个 O
- **团队 OKR**:部门 / 小组负责的目标,承接公司 O周期常用季度
- **个人 OKR**:成员自己的工作目标,承接所在团队 OKR颗粒度最细
## 谁负责
- **公司 OKR**CEO / 高管层
- **团队 OKR**:团队 leader 牵头,团队共同认领
- **个人 OKR**:成员本人;直属上级辅助审阅
## 对齐路径
- 个人 OKR → 团队 OKR → 公司 OKR形成可追溯链路
- 同一团队的多个个人 OKR 可分别承接团队不同 KR
- 详细操作见 [[okr.align.howto]]
## 团队 OKR 的特征
- 团队 KR 数量通常 3-5 个
- 团队 KR 由若干成员合力完成,但应明确「主负责人」
- 团队 KR 进度通常由 leader 汇总更新
## 个人 OKR 的特征
- 个人 O 不必覆盖所有日常工作,只挑这个周期最重要的方向
- 个人 KR 与所在岗位职责高度相关
- 数量通常 2-4 个 O
## 不支持
- 团队 OKR 不会自动汇总所有个人 OKR 的进度
- 一个个人不属于两个团队时,需自行决定主对齐方向
## 相关
- 对齐:[[okr.align.howto]]
- OKR 概念:[[okr.concept]]
- 周期:[[okr.cycle.concept]]

View File

@ -1,55 +0,0 @@
---
id: search.engine.concept
title: 搜索引擎(Manticore 与 MySQL 回退)
type: concept
feature: search
scope: admin
locale: zh
aliases:
- 搜索引擎
- Manticore
- 搜索插件
- 搜索很慢
- 为什么搜不到文件内容
- 语义搜索
related_tools: []
related_pages: []
prerequisites: []
negative:
- 未安装 search 插件时无法搜索文件正文,只能按文件名模糊匹配
- 未安装 search 插件时不支持语义 / 向量 / 混合搜索,只能精确关键词
- 向量搜索还需要 ai 插件提供 Embedding仅装 search 没装 ai 也走不了语义
last_verified: v1.7.90
---
# 搜索引擎(Manticore 与 MySQL 回退)
## 定义
DooTask 全局搜索底层有两套实现,按 `Apps::isInstalled('search')` 自动切换:装了应用市场的 search 插件就走 Manticore没装就退回 MySQL `LIKE` 模糊查询。
## Manticore 搜索引擎
Manticore Search 是独立的开源搜索引擎,作为可选插件部署在 DooTask 的 appstore 里。能力包括:
- **全文搜索**text倒排索引 + ICU 中文分词
- **向量搜索**vector1536 维 KNNHNSW 算法),需配合 AI 插件生成 Embedding
- **混合搜索**hybrid默认同时打全文和向量分取加权综合排名
- **文件正文搜索**:可搜 Word / Excel / PPT / PDF / TXT / 代码文件等内部文本
接口参数 `search_type` 取值 `text` / `vector` / `hybrid`,默认 `hybrid`**只在装了 Manticore 时生效**。
## MySQL 回退
未装 search 插件时调 `searchByKeyword`,用 MySQL `LIKE %keyword%` 匹配。能力受限:
- 只匹配字面关键词,不理解同义词或语义
- 不能搜文件正文PDF / Office 内部文本搜不到)
- 大数据量下性能不如 Manticore
- 不支持 relevance 排序,按时间倒序
## 部署形态
插件镜像独立维护appstore 应用search技术规格
- 向量维度1536兼容 OpenAI text-embedding-3-small
- 中文分词ICU Chinese
- 推荐至少 2GB 可用内存
## 何时升级到 Manticore
- 需要搜索文件内容(不仅是文件名)
- 用自然语言查文件如「财务分析文档」→「Q3 收入报表」)
- 团队消息 / 任务量大MySQL `LIKE` 已经慢

View File

@ -1,59 +0,0 @@
---
id: search.intelligent.concept
title: 智能搜索(AI 语义搜索)
type: concept
feature: search
scope: end-user
locale: zh
aliases:
- 智能搜索
- AI 搜索
- 语义搜索
- 自然语言搜索
- intelligent_search
- 向量搜索
related_tools: [intelligent_search]
related_pages: []
prerequisites:
- 应用商店(应用市场)已安装 search 插件Manticore Search
- 应用商店已安装 ai 插件(语义 / 向量搜索需用其生成 Embedding
negative:
- 未安装 search 插件Manticore时回退普通 MySQL 关键词搜索,无语义能力
- 仅装 search 没装 ai 时,向量 / 语义 / 混合搜索无法生效,只能跑全文 text
- 索引建立有延迟,刚上传 / 新建的内容可能短时间内搜不到
- 智能搜索按权限过滤,搜不到的对象通常是无权访问
last_verified: v1.7.90
---
# 智能搜索(AI 语义搜索)
## 定义
智能搜索是 DooTask 基于 **Manticore Search 插件**search 插件的统一检索能力支持关键词text/ 语义向量vector/ 混合hybrid三种搜索类型一次可跨任务 / 项目 / 文件内容 / 联系人 / 消息 5 类对象AI 助手通过 MCP 工具 `intelligent_search` 调用同一套底座。
## 底层原理
- 走 SearchController 统一接口,优先使用 Manticore Search需安装 search 插件)
- **未安装 search 插件时回退到普通 MySQL 关键词搜索**,仍可按字面匹配搜索,但没有语义 / 向量能力
- 默认 `search_type = hybrid`(混合搜索):同时打全文倒排分和 KNN 向量分
- 向量分由 ai 插件提供 Embedding1536 维,兼容 OpenAI text-embedding-3-small
- 中文用 ICU 分词,能处理常见同义词与近义表达
## 与关键词搜索的区别
- **关键词搜索**只命中字面匹配「Q3 收入报表」搜「财务分析」会落空
- **智能搜索**理解意图「财务分析」能命中「Q3 收入报表」「年度成本表」等语义相关文件
- 智能搜索仍保留关键词命中能力,相关度由混合算法加权
## 关键属性
- **入口**:装齐 search + ai 后全局搜索框会出现「AI 搜索」按钮,把搜索词转给 AI 助手AI 助手自动调用 `intelligent_search` 工具
- **结果排序**:按 `relevance` 综合分降序
- **权限范围**:与基础 search 接口完全一致,只返回当前用户能看到的对象
- **延迟**:依赖 Manticore 索引;新增内容入库到可搜的间隔通常为秒级
## 与全局搜索的关系
- 全局搜索 = 用户在搜索框内主动输入关键词的检索能力,详见 [[search.concept]]
- 智能搜索 = AI 助手在对话中代用户调用的同一套底座,搜索类型默认 `hybrid`
## 不支持
- 没装 search 插件Manticore时回退 MySQL 关键词搜索,关键词 / 语义 / 混合类型参数失效
- 装了 search 但没装 ai 插件时降级到全文,语义能力失效
- 不能跨用户搜别人的私聊 / 私有文件
- 单次每类对象不会返回超过 50 条(最多 50 条)

View File

@ -1,48 +0,0 @@
---
id: search.concept
title: 全局搜索是什么
type: concept
feature: search
scope: end-user
locale: zh
aliases:
- 全局搜索
- 搜索是什么
- 总搜索
- 怎么搜东西
- 在哪里搜
related_tools: []
related_pages: []
prerequisites: []
negative:
- 全局搜索不会跨用户:只能搜到当前账号有权限看到的内容
- 关键词为空时不会触发搜索,必须输入至少 1 个字符
- 单次搜索每类对象最多返回 50 条(默认 20 条)
last_verified: v1.7.90
---
# 全局搜索是什么
## 定义
全局搜索是 DooTask 内的统一检索入口,能够一次性跨 5 类对象查找内容:联系人、项目、任务、文件、消息。对应后端 `api/search/*` 5 个接口,统一在 SearchController 实现。
## 5 类搜索对象
- **联系人**contact按昵称 / 邮箱 / 个人简介 / 技能标签匹配用户
- **项目**project按项目名 / 项目描述匹配当前用户可访问的项目
- **任务**task按任务名 / 描述 / 子内容匹配用户所在项目内的任务
- **文件**file按文件名匹配安装 search 插件后还能搜文件正文
- **消息**message按消息文本匹配用户能看到的会话消息
## 权限模型
所有搜索都先做用户身份验证(`User::auth()`),结果只返回当前用户**已经有权限访问**的对象。搜不到不一定是关键词错,也可能是没有权限。
## 双引擎设计
全局搜索有两套底层实现,按是否安装 search 插件自动切换:
- 装了 Manticore 搜索插件:走 Manticore支持全文 / 向量 / 混合搜索
- 未装:自动降级到 MySQL `LIKE` 模糊匹配
详见 [[search.engine.concept]]。
## 入口
- 桌面端:快捷键 `Ctrl/Cmd + F``Ctrl/Cmd + /`,详见 [[search.entry.menu-map]]
- 移动端:在仪表盘等页面通过搜索按钮触发

View File

@ -1,68 +0,0 @@
---
id: ai-assistant.disabled.faq
title: 我看不到 AI 助手入口
type: faq
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 找不到 AI
- AI 浮按钮没有
- 没有 AI 助手
- 我的 DooTask 没 AI
- AI 入口消失
- 别人有 AI 我没有
related_tools: []
related_pages: []
prerequisites: []
negative:
- 普通用户无法自助开通 AI必须由系统管理员开
- 浮按钮 / 快捷键 / 全局「+」菜单都依赖同一个 ai 插件标识
- 不同部署的 DooTask 是否带 AI 取决于管理员决定
last_verified: v1.7.90
---
# 我看不到 AI 助手入口
## 问题
- 屏幕右下角没有 AI 浮按钮
- 按 Cmd+I / Ctrl+I 没反应
- 右上角全局「+」菜单里没有「AI 助手」项
- 同事的 DooTask 有 AI自己的没有
## 常见原因
### 1. AI 插件未安装(最常见)
- AI 助手是**微应用 / 系统插件**,需在「应用市场」安装 `ai` 插件
- 前端通过 `microAppsIds.includes('ai')` 决定是否显示入口;没装则所有 AI 入口都不渲染
### 2. 管理员关闭了 AI 模型
- 即使 ai 插件已装,系统设置 →「AI 模型」未启用任何服务商
- 浮按钮可能仍显示,但模型下拉为空、无法发送,详见 [[ai-assistant.model-empty.faq]]
### 3. License 限制
- 部分 DooTask 部署的 License 不含 AI 模块
- ai 插件不出现在应用市场可装列表
### 4. 老缓存
- 前端 `microAppsIds` 陈旧;刚装好但旧 tab 没刷新
- 解决强制刷新Ctrl+F5
### 5. 路由是登录页
- 浮按钮明确排除登录页(`routeName !== 'login'`
- 登录后再看
## 解决
1. **联系系统管理员**:到「应用市场」安装并启用 `ai` 插件
2. **管理员配 AI 模型**:在系统设置 →「AI 模型」开启至少一个服务商
3. **强制刷新**Ctrl+F5 / Cmd+Shift+R 重新拉 `microAppsIds`
4. **重启容器(管理员)**:刚装完插件可能需重启 ai 容器
## 如何区分原因
- 入口**完全不显示**(连浮按钮都没)→ ai 插件未装
- 入口能看到但下拉空 → 模型未配,详见 [[ai-assistant.model-empty.faq]]
## 相关
- [[ai-assistant.entry.howto]]
- [[ai-assistant.model-empty.faq]]
- [[ai-assistant.auth.concept]]

View File

@ -1,57 +0,0 @@
---
id: ai-assistant.mcp-down.faq
title: AI 的 MCP 工具不可用
type: faq
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- mcp 挂了
- mcp_server 不可用
- AI 全部工具不能用
- AI 都不能操作
- MCP 连接失败
- AI 助手只能聊天不能动手
related_tools: []
related_pages: []
prerequisites: []
negative:
- 普通用户不能自助重启插件,需管理员
- mcp_server 容器异常时所有 33 个 MCP 工具都不可用(包含页面操作)
- 不影响纯文本对话和知识库检索search_help_docs 是 AI 容器内置)
last_verified: v1.7.90
---
# AI 的 MCP 工具不可用
## 问题
AI 浮窗能聊天但任何"做事"指令都失败:
- 浮窗顶部不显示工具图标
- 让 AI 建任务 / 发消息 / 跳页面都没反应
- 工具气泡显示「连接失败」「mcp_server unavailable」
## 原因
- **mcp_server 插件未安装**:应用市场没装这个系统插件
- **mcp_server 容器挂了**:宿主资源不足 / 配置错误导致容器退出
- **WebSocket 不通**:反向代理 / 防火墙拦截了 `wss://.../apps/mcp_server/mcp/operation` 路径
- **AI 模型配置缺工具能力**:管理员配模型时关了 tool 调用集成
## 解决(普通用户)
1. 先确认是不是只你一个人的问题:和同事对比
2. 报给系统管理员,告知"mcp_server 不可用"
3. 等待恢复期间可改用:
- 手动用前端操作功能
- 用 AI 做纯文本辅助(写文案 / 总结 / 翻译)
- 知识库检索(`search_help_docs` 不依赖 mcp_server仍可用
## 解决(管理员)
1. 应用市场 → 找到 `mcp_server` → 看运行状态
2. 没安装 → 安装
3. 已安装但状态异常 → 重启该插件
4. 长期失败 → 看插件日志(容器 docker logs排查
5. 反向代理:确保 wss 路径未被拦
## 相关
- 工具失败:[[ai-assistant.tool-failed.faq]]
- 没调工具:[[ai-assistant.no-tool-call.faq]]
- 工具机制:[[ai-assistant.tools.concept]]

View File

@ -1,55 +0,0 @@
---
id: ai-assistant.model-empty.faq
title: AI 助手模型下拉是空的
type: faq
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 选不了模型
- 模型下拉为空
- 暂无可用模型
- 没有可选 AI
- AI 不能发送
related_tools: []
related_pages: []
prerequisites: []
negative:
- 普通用户无法自助开通 / 配置模型,必须由系统管理员处理
- 下拉空多数是后端配置层面的事,不是网络问题
- DooTask 不自带任何免费内置模型
last_verified: v1.7.90
---
# AI 助手模型下拉是空的
## 问题
打开 AI 助手浮窗后,**底部「选择模型」下拉框**为空,显示「暂无可用模型」或灰色禁用,按发送也无反应。
## 常见原因
1. **管理员没启用任何模型**
- 系统设置 → 「AI 模型」中所有服务商开关都关着,或未填 API Key
2. **AI 插件未安装**
- 应用市场没装 ai 插件;如果连入口都没有则属于 [[ai-assistant.disabled.faq]]
3. **API Key 失效**
- 管理员填了 Key 但已过期 / 余额耗尽,后端返回模型列表为空
4. **接口请求失败**
- `GET api/assistant/models` 出错(鉴权失败、网络抖动),前端弹「获取模型列表失败」并自动关浮窗
5. **管理员开了模型但没设默认**
- 极少数情况:模型列表为空数组
## 解决
1. **联系系统管理员**:到「系统设置 → AI 模型」开启至少一个服务商并填可用 API Key
2. **检查 ai 插件**:管理员到「应用市场」确认 ai 插件已装且未禁用
3. **刷新页面**:关闭 AI 助手浮窗后重新打开,触发新一次 `api/assistant/models`
4. **看后台 ai-bot 日志**:管理员排查 dootask-ai 容器日志,确认上游 API 可达
## 与其他「AI 看不到」的区别
- 下拉**空** = 管理员配置层面问题
- AI 入口**完全看不到**(浮按钮 / 快捷键无效)= ai 插件未装,详见 [[ai-assistant.disabled.faq]]
## 相关
- [[ai-assistant.model.concept]]
- [[ai-assistant.disabled.faq]]

View File

@ -1,51 +0,0 @@
---
id: ai-assistant.no-tool-call.faq
title: AI 应该调工具但没调
type: faq
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 不调工具
- AI 只说不做
- AI 没操作
- AI 没建任务
- AI 干说
- 让 AI 做事它只回答
related_tools: []
related_pages: []
prerequisites: []
negative:
- 选了纯文本模型时无论怎么提问都不会调工具
- 即使支持 tool call 的模型也可能误判为"无需工具",需重提问引导
- AI 不会暴露完整工具清单,让你逐个点选
last_verified: v1.7.90
---
# AI 应该调工具但没调
## 问题
明明让 AI 帮忙建任务 / 发消息 / 跳页面,但 AI 只口头回答"好的,我会…"或"建议你…",并没有调用工具实际操作。
## 常见原因
- **模型不支持 function calling**:选了纯文本模型
- **mcp_server 插件未安装/挂掉**:工具列表为空
- **意图不明确**:模型判断为闲聊,没决策需要工具
- **管理员关闭了工具集成**
- **上下文超长**:会话累积过多,模型"忘了"工具能力
## 解决
1. **换模型**:浮窗顶部切到「支持工具」的模型
2. **明确指令**:换成动词命令"建任务"、"发消息"、"打开"
3. **加资源 ID**:给具体的项目名 / 任务 ID
4. **新开会话**:超长会话可能异常,重开试
5. **检查 mcp_server**:让管理员看插件运行状态
## 例子
- 不好:"小王任务这事跟一下" → AI 回复"建议您…"
- 好:"给小王在项目 X 新建任务:周五前回归测试" → AI 调 `create_task`
## 相关
- 工具机制:[[ai-assistant.tools.concept]]
- 工具列表:[[ai-assistant.tools-list.concept]]
- MCP 不可用:[[ai-assistant.mcp-down.faq]]

View File

@ -1,49 +0,0 @@
---
id: ai-assistant.tool-failed.faq
title: AI 工具调用失败怎么办
type: faq
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 调工具报错
- tool_call failed
- AI 操作失败
- AI 工具不响应
- AI 卡在执行中
- AI 调用超时
related_tools: []
related_pages: []
prerequisites: []
negative:
- 工具失败不会自动二次重试,需用户重新触发
- 失败不会回滚已成功的工具(如已建任务再发消息失败,任务保留)
- 隐藏错误细节属正常,敏感字段不会暴露给用户
last_verified: v1.7.90
---
# AI 工具调用失败怎么办
## 问题
浮窗里 AI 调工具的气泡显示「失败」「执行超时」「无权限」「找不到资源」等,回复也提示"没能完成"。
## 常见原因
- **后端短时不可用**`mcp_server` 容器重启 / 网络抖动
- **权限不足**:操作了你没权限访问的资源(如别人的任务、非成员的项目)
- **参数错误**AI 推断的 ID 不存在(如任务已被删)
- **超时**:单次工具调用默认 30 秒超时,长操作(大列表/复杂搜索)会断
- **页面不在线**:页面操作(打开任务/跳页面/操作元素)需要前端 socket 在线,关浏览器后立刻让 AI 操作会失败
- **模型不支持 tool call**:选了纯文本模型,根本不会调
## 解决
1. **重试**:浮窗里点工具气泡上的「重试」按钮,或回复"再试一次"
2. **换措辞**:原句太模糊就给更具体的 ID / 关键词
3. **检查权限**:项目级问负责人加成员;任务级问任务负责人加可见用户
4. **换模型**:选标注「支持工具」的模型,浮窗顶部切换
5. **刷新页面**:页面动作失败时刷新一次后再让 AI 重试
6. **联系管理员**:连续失败请通知管理员看 `mcp_server` 插件日志
## 相关
- 工具机制:[[ai-assistant.tools.concept]]
- 权限不足:[[ai-assistant.tool-permission.faq]]
- MCP 不可用:[[ai-assistant.mcp-down.faq]]

View File

@ -1,54 +0,0 @@
---
id: ai-assistant.tool-permission.faq
title: AI 提示没权限操作怎么办
type: faq
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 没权限
- AI 提示权限不足
- AI 不能改这个
- AI 操作被拒
- AI 看不到这个任务
- AI 不能访问
related_tools: []
related_pages: []
prerequisites: []
negative:
- AI 不能绕过 DooTask 权限体系,调工具同样走后端鉴权
- 没有「AI 超级模式」开关AI 的权限始终等同当前登录用户
- 普通用户无法自助提权,必须由管理员或负责人调整
last_verified: v1.7.90
---
# AI 提示没权限操作怎么办
## 问题
AI 工具调用气泡显示「无权限」「您不在可见用户列表」「不是项目成员」等错误AI 回复说"无法帮您完成"。
## 原因
AI 以你当前登录身份调用所有工具,后端的所有权限校验都生效:
- **项目级**:非项目成员看不到/不能改项目内任务
- **任务级**:任务设了可见用户白名单,名单外用户即使是项目成员也看不到
- **角色级**:改项目设置 / 删列 / 改成员需要项目负责人或管理员
- **系统级**:装插件 / 改系统设置 / 看导出 / 管理用户需要系统管理员userIsAdmin
- **超级管理员**:超管专属功能仅 id=1 的用户可用
## 解决
1. 确认操作类型对应哪一级权限
2. 联系对应角色补加权限:
- 项目级 → 联系项目负责人加你为成员或改角色
- 任务级 → 联系任务负责人把你加入可见用户
- 系统级 → 联系系统管理员
3. 部分功能依赖插件已安装(如审批要 approve 插件)
4. 让 AI 换种方式(如不能 update_task 可改成 send_message 通知负责人改)
## 怎么看自己的权限
- 头像 → 「个人设置」可看部门 / 角色
- 系统管理员 / 部门负责人身份会显示在右上角下拉菜单顶部
## 相关
- 通用权限不足:[[role-permission.permission-denied.faq]]
- 工具调用失败:[[ai-assistant.tool-failed.faq]]

View File

@ -1,41 +0,0 @@
---
id: checkin.face-fail.faq
title: 人脸识别失败怎么办
type: faq
feature: checkin
scope: end-user
locale: zh
aliases:
- 人脸识别失败
- 刷脸不成功
- 人脸录入失败
- 上传人脸报错
- 识别不到我的脸
related_tools: []
related_pages: []
prerequisites: []
last_verified: v1.7.90
---
# 人脸识别失败怎么办
## 问题
上传人脸图片或现场扫脸时报错,比如「设置失败」「上传出错」「未识别到人脸」「该应用未安装」等。
## 原因
- **face 插件没装**:主程序调 face 容器 `http://face:7788/user` 调不通,会先抛 `请先安装 face` 异常
- **face 容器没起来**:容器异常或镜像没拉成功(约 15MB+,首次安装慢)
- **签到方式没开人脸**:管理员未在「签到设置 → 签到方式」勾选「人脸签到」
- **未开放上传**:管理员未在「签到设置 → 允许修改」开启「允许成员上传人脸图片」,提交会返回「未开放修改权限」
- **图片质量差**:模糊 / 侧脸 / 多人 / 太暗 → 后端识别引擎拒绝入库
- **现场设备问题**:人脸识别一体机离线、网络断、未对接到 face 容器
## 解决
1. 联系管理员确认 face 插件已在应用市场安装
2. 让管理员去「签到设置」开启「人脸签到」+「允许成员上传人脸图片」
3. 重新上传一张**正面、光线均匀、单人、500x500 左右**的清晰照片
4. 现场扫脸失败时换个角度 / 摘掉口罩 / 重启设备
5. 若一直失败,临时改用 [[checkin.regular.howto]] 手动签到或 [[checkin.wifi.howto]] WiFi 签到
## 不支持
- 主程序自己不做人脸比对,所有错误都从 face 插件返回;卸载 face 后人脸签到能力完全消失

View File

@ -29,7 +29,7 @@ DooTask 签到没打上(漏签 / 迟到),日历上显示当天为空或时
## 原因
- **签到时间窗口外**:管理员配置了「最早可提前」「最晚可延后」分钟数,超出窗口的打卡会被拒
- **MAC / 人脸未匹配**WiFi 签到时 MAC 没绑或不在办公网 → [[checkin.mac-not-match.faq]];人脸识别失败 → [[checkin.face-fail.faq]]
- **MAC / 人脸未匹配**WiFi 签到时 MAC 没绑或不在办公网 → [[checkin.mac-not-match.faq]];人脸识别失败见人脸识别face应用知识库
- **忘记打卡**:完全没操作
- **非工作日**:节假日不会发提醒,但只要打卡了一样会记录

View File

@ -48,4 +48,4 @@ DooTask 的 AI 能力由独立的 **ai 插件**`dootask-ai`)提供。下面
- 主程序不能跳过 ai 插件直连模型
- 一次只能选一个默认模型作为系统主模型
更多 AI 助手能力见 [[ai-assistant.entry.howto]] / [[ai-assistant.tools-list.concept]]
更多 AI 助手能力说明随 ai 插件知识库提供。

View File

@ -50,4 +50,4 @@ AI 回复时延受多重因素影响:
- 无内置「响应慢自动降级」机制
- 中断回复只能整体停止本轮,不能保留已生成的文本继续
[[ai-assistant.entry.howto]] / [[ai-assistant.tool-call.concept]]
更多 AI 助手说明随 ai 插件知识库提供。

View File

@ -31,7 +31,7 @@ last_verified: v1.7.90
AI 助手的工具调用本质是后端 API 调用,**全部以你的身份发起**。所以:
- 你本人没权限做的事AI 也做不了
- AI 调 `create_task` 时实际就是用你的会话去走 [[ai-assistant.create-task.howto]] 的 API你不在项目里就会被拒绝
- AI 调 `create_task` 时实际就是用你的会话去调对应 API你不在项目里就会被拒绝
- `update_task` 改任务必须满足任务负责人 / 项目负责人 / 系统管理员条件之一
- 「加成员」必须你本身能加(项目负责人 / 系统管理员)
@ -48,4 +48,4 @@ AI 助手的工具调用本质是后端 API 调用,**全部以你的身份发
- AI 不读不到的会话不会偷偷读取(隐私边界 = 用户的可见范围)
- AI 工具失败不会自动二次重试,需要用户重新发问
[[ai-assistant.tool-call.concept]] 解释了工具调用的事件结构;[[role-permission.permission-denied.faq]] 解释通用权限规则。
工具调用的事件结构说明随 ai 插件知识库提供[[role-permission.permission-denied.faq]] 解释通用权限规则。

View File

@ -47,4 +47,4 @@ AI 助手回答与事实不符,编了不存在的功能 / 菜单 / 快捷键
- AI 不会拒绝回答它不熟的问题(可能编造),需用户保持警惕
- AI 不会自动跨会话学习——「你上次错过的」对新会话无影响
[[ai-assistant.search-help-docs.howto]] 触发知识库检索;[[ai-assistant.tool-call.concept]] 看真实工具调用判断 AI 是否真做了
可触发知识库检索,并查看真实工具调用判断 AI 是否真做了AI 助手相关说明随 ai 插件知识库提供)

View File

@ -55,7 +55,7 @@ last_verified: v1.7.90
**附件**:批量上传到文件目录([[file.upload.howto]])。
**文档**:复制文本到 office[[office.create.howto]])或 memos[[memos.create.howto]])。
**文档**:复制文本到 office 或 memos 等文档类应用(具体新建方式见对应应用知识库)。
## 不支持
- 不支持保留源任务 ID / URL 映射

View File

@ -1,48 +0,0 @@
---
id: okr.cannot-install.faq
title: 看不到 OKR / 安装失败怎么办
type: faq
feature: okr
scope: end-user
locale: zh
aliases:
- OKR 看不到
- OKR 入口没有
- OKR 装不上
- OKR 安装失败
- OKR 怎么开通
- OKR 安装很慢
related_tools: []
related_pages: [application]
prerequisites: []
negative:
- 主程序不内置 OKR未装插件时入口绝对不会出现
- 普通用户无法自助安装应用市场插件,需要系统管理员操作
last_verified: v1.7.90
---
# 看不到 OKR / 安装失败怎么办
## 问题
打开 DooTask 后在应用中心看不到「OKR 管理」入口,或在「应用商店」(应用市场)点了「安装」后长时间没有反应、提示失败。
## 常见原因
- OKR 是独立插件(应用商店 app id`okr`),主程序不内置;未装时入口不出现
- 普通用户没有应用商店的安装权限,必须系统管理员(`userIsAdmin`)安装
- 插件镜像约 15MB首次拉取较慢看起来像「卡住」实际仍在下载
- 服务器无法访问应用商店镜像源(网络 / 防火墙 / DNS 问题)
- 主程序版本低于 1.1.66,不满足插件要求
## 解决
1. 确认自己角色:非管理员就联系管理员安装
2. 管理员打开「应用」→ 管理员分区「应用商店」搜索「OKR」或「目标管理」
3. 点击安装后,通过应用商店的安装日志查看实时进度(不要立即重试)
4. 日志卡在拉取镜像:检查服务器到镜像源的网络连通性,确认能拉取 Docker 镜像
5. 提示版本不兼容:先升级主程序到 > 1.1.66 再安装
6. 安装完成但入口不出现:刷新浏览器 / 重新登录一次
7. 安装失败可在应用商店重试,仍失败请保留日志反馈给运维
## 相关
- 插件元信息:[[okr.plugin.concept]]
- OKR 入口:[[okr.entry.menu-map]]
- 通用权限问题:[[role-permission.permission-denied.faq]]

View File

@ -1,48 +0,0 @@
---
id: search.no-result.faq
title: 搜不到或结果不全
type: faq
feature: search
scope: end-user
locale: zh
aliases:
- 搜不到
- 搜索没结果
- 搜索结果不全
- 为什么搜不到
- 搜不到文件内容
- 搜不到群消息
related_tools: []
related_pages: []
prerequisites: []
negative:
- 全局搜索不会显示「不属于你」的对象,即使关键词完全匹配
- 不会自动跨用户搜索别人的私聊或文件
last_verified: v1.7.90
---
# 搜不到或结果不全
## 问题
全局搜索输入关键词后没有结果,或者结果数量明显少于实际存在的对象。
## 原因
按出现频率从高到低:
1. **权限范围限制**:所有搜索只返回当前用户能访问的对象(详见各子接口),无权对象不会出现
2. **对象处于不可见状态**:已归档项目、已归档 / 已删除任务、已禁用用户、机器人账号都会被过滤
3. **未装 Manticore 插件**MySQL 回退只匹配字面关键词,且文件正文 / 任务描述里的关键词搜不到(见 [[search.engine.concept]]
4. **正文未被索引**:装了 Manticore但文件超过大小阈值Office > 50MB / 文本 > 5MB / 其他 > 20MB或类型不支持
5. **达到单次返回上限**:默认返回 20 条,最多 50 条,匹配项更多时会被截断
6. **关键词大小写 / 全半角差异**MySQL 回退对全 / 半角和大小写敏感度有限
## 解决
1. 确认当前账号是否在对应项目 / 对话的成员列表
2. 在搜索框切换分类标签(任务 / 项目 / 消息 / 联系人 / 文件),看是否被聚合截断了
3. 如果是搜不到文件正文:联系管理员安装 search 插件([[search.engine.concept]]
4. 如果是搜归档对象:先到对应模块解归档,再搜
5. 增加 `take` 参数到 50接口调用方
6. 用更准确的关键词或换一种说法
## 相关
- 引擎差异:[[search.engine.concept]]
- 入口与快捷键:[[search.entry.menu-map]]

View File

@ -1,69 +0,0 @@
---
id: ai-assistant.close.howto
title: 关闭 AI 助手浮窗
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 关闭 AI
- 退出 AI 助手
- AI 浮窗关掉
- 关 AI 弹窗
- 取消 AI 对话
related_tools: []
related_pages: []
prerequisites:
- AI 助手浮窗已打开
negative:
- 关闭只是隐藏弹窗 + 终止活跃 SSE 流,不会删除当前会话
- 桌面端关闭后短时间内浮窗不会自动弹回,需再点浮按钮 / 快捷键
- 移动端没有 Esc 键关闭
last_verified: v1.7.90
---
# 关闭 AI 助手浮窗
## 入口
### 桌面端 chat 浮窗
- 浮窗**右上角「×」**关闭按钮
- 键盘 `Esc`(仅 chat displayMode 生效)
- chat 浮窗无遮罩,点击外侧不会关闭
### 桌面端 modal 模态(业务嵌入入口)
- 弹窗**右上角「×」**或顶部关闭图标
- 遮罩点击:默认**不**关闭(`mask-closable: false`
- 键盘 `Esc`modal 模式当前实现下不响应
### 移动端
- 浮窗**右上角「×」**`Icon type="ios-close"`
- 浮窗顶部下拉「关闭」
- 无键盘快捷键
## 关闭时发生了什么
1. `showModal = false`
2. 触发 `aiAssistantClosed` 事件
3. **不会**自动清理当前会话(保留在内存 + 已持久化的留在数据库)
4. 活跃的 SSE 流被同会话切换 / 新提问触发的清理逻辑回收
5. 浮按钮重新显示(关闭时浮按钮被 `!this.$parent?.showModal` 条件隐藏)
## 关闭后下次打开
- 当前会话和模型选择都保留
- 输入框内容**不**保留(关闭即清空)
- 待发送的图片也会清空(`clearPendingImages`
## 完全隐藏 AI 助手
- 关闭浮窗只是临时隐藏,**浮按钮**仍在屏幕边缘
- 完全去掉浮按钮需管理员卸载 ai 插件或关闭 AI 模型
- 详见 [[ai-assistant.disabled.faq]]
## 不支持
- 不支持「最小化为小球」(关掉就是关掉,再开是新一次打开)
- 不支持「关闭并清空当前会话」一键操作(手动删除:[[ai-assistant.session-delete.howto]]
- 不支持点击浮窗外区域自动关闭
## 相关
- [[ai-assistant.entry.howto]]
- [[ai-assistant.stop.howto]]
- [[ai-assistant.float-button.concept]]

View File

@ -1,59 +0,0 @@
---
id: ai-assistant.create-task.howto
title: 让 AI 帮我创建任务
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 建任务
- AI 加 todo
- AI 新建待办
- 让 AI 创建一个任务
- AI 帮我下任务
- 给小王分个任务
related_tools: [create_task]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
- 当前用户在目标项目中是成员或负责人
negative:
- 不能在不是自己项目的位置建任务(会提示无权限)
- AI 不会未经确认直接建复杂任务,长字段一般会先复述再创建
- 创建后任务的 ID/URL 会返回,可让 AI 继续打开它
last_verified: v1.7.90
---
# 让 AI 帮我创建任务
## 这是什么
在 AI 浮窗自然语言描述要建的任务AI 会调 `create_task` 工具在目标项目下新建一条任务,自动解析负责人、截止时间、优先级、所属列。
## 怎么问
一次性把关键信息说全AI 解析准确率最高:
- "在『官网改版』项目建一个任务周五前完成首页banner切图分给小王"
- "建个明天 18 点截止的紧急任务:上线前回归测试,我负责"
- "项目X里加一条任务『写 PRD』无负责人无截止时间"
## AI 通常会确认
- 模糊的项目名 → 先调 `list_projects` 让你选
- 模糊的"小王" → 调 `search_users` 列同名用户让你确认
- 没说截止时间 → 直接不设置(不会乱猜)
- 没说负责人 → 默认建未分配,可后续追加
## 创建后能继续做什么
- "打开它" → 调页面工具跳详情
- "再加 3 个子任务:前端、后端、测试" → 调 `create_sub_task`
- "把这条同步到 X 群" → 调 `send_message`
## 不支持
- 不能建跨项目任务(任务必须归属一个项目)
- 不能在 AI 这步同时设置自定义字段(需打开任务详情手动改)
- AI 不会主动给任务套已有模板,需明示「按 X 模板创建」
## 相关
- 列任务:[[ai-assistant.list-tasks.howto]]
- 创建项目结构:[[ai-assistant.project-init.howto]]
- 子任务建议:[[ai-assistant.subtask-suggest.howto]]

View File

@ -1,69 +0,0 @@
---
id: ai-assistant.element-action.howto
title: 让 AI 操作页面元素
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 点按钮
- AI 帮我输入
- AI 选下拉
- AI 滚动页面
- AI 自动填表
- AI 点击 X
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
- 当前页面已加载完成
negative:
- 元素必须可见且未被遮挡才能点击,被滚出视野时需先 scroll
- 不能模拟键盘组合键(如 Cmd+S、不能拖拽
- AI 找不到匹配元素时会道歉并要求换种描述,不会盲点
last_verified: v1.7.90
---
# 让 AI 操作页面元素
## 这是什么
让 AI 助手在你当前页面上直接操作具体元素,包括点击按钮、输入文本、选下拉项、聚焦、滚动、悬停。常用于完成详细表单或触发某个隐藏在多级菜单里的功能。操作由 AI 助手在你的浏览器/桌面端页面上执行。打开了微应用插件(同源)时,这些操作会默认作用于最前那个微应用的内部。
## 怎么问
- "点击『保存』按钮"
- "在标题框输入『官网首页改版』"
- "把优先级下拉选成『高』"
- "滚动到页面底部"
- "悬停在第一个项目卡片上"
## AI 的执行链路
1. 先采集当前页面的可交互元素清单
2. 用 `match_elements` 接口按描述("保存按钮"、"标题输入框")找到目标 ref
3. 在你的页面上触发 click / type / select / focus / scroll / hover
## 支持的动作
| 动作 | 说明 |
|---|---|
| click | 触发原生 click 事件 |
| type | 设置 input / textarea / contentEditable 的值并触发 input/change 事件 |
| select | 原生 select 或 iView 下拉,按选项文本匹配 |
| focus | 聚焦元素 |
| scroll | 平滑滚动到屏幕中央 |
| hover | 模拟 mouseenter/mouseover |
## 不支持的动作
- 不能模拟键盘按键、不能模拟组合键
- 不能拖拽元素drag/drop
- 不能操作跨源(外部站点)微应用 iframe 的内部元素(同源微应用插件内部可操作)
- 不能等到某个异步加载完成再点(无 wait 机制,需用户重新触发)
## 找不到元素怎么办
- 改用更具体的描述("右上角保存按钮"代替"保存")
- 先让 AI 跳到元素所在页(`open_task` 等)
- 元素在折叠面板里,先让 AI 展开
## 相关
- 跳页面 / 打开任务:[[ai-assistant.page-action.howto]]
- match_elements 接口:[[ai-assistant.match-elements.concept]]
- 页面上下文:[[ai-assistant.page-context-tool.concept]]

View File

@ -1,52 +0,0 @@
---
id: ai-assistant.entry.howto
title: AI 助手怎么打开
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 助手在哪
- 怎么开 AI
- 打开 AI
- AI 入口
- AI 浮窗
- 怎么用 AI
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已在系统设置「AI 模型」中配置至少一个模型的 API key
negative:
- AI 助手本身不是「应用中心」里的卡片(区别于审批 / 签到等),是系统级特性
- 未安装 ai 插件时所有 AI 入口都不会显示
- 桌面端关闭浮窗后短时间内不会自动弹回,可手动唤起
last_verified: v1.7.90
---
# AI 助手怎么打开
## 全局入口(桌面端)
- **浮窗按钮**:屏幕右下角的圆形 AI 图标,点击展开聊天浮窗(位置可拖动,会贴边收起成竖条)
- **快捷键**Cmd + ImacOS/ Ctrl + IWin/Linux任意页面都能呼出
- **顶部「+」菜单**:右上角全局「+」下拉里有「AI 助手」项(需 ai 插件已安装)
## 移动端入口
- **悬浮按钮**:右下角小球,长按拖动到任意位置
- 第一次打开会自动收起到屏幕边缘,点开后可全屏对话
## 业务场景嵌入入口
- **项目创建**:新建项目时项目名输入框旁边有 AI 按钮,点击让 AI 帮你生成项目结构
- **任务详情**:任务讨论区可 @AI 让它分析任务、生成子任务建议
- **工作报告**:报告编辑器内可让 AI 基于近期任务自动生成报告草稿
- **消息会话**:群里 @AI 让它回答问题、总结对话、翻译消息
## 切换模型
浮窗顶部下拉框选择模型可用模型由管理员在系统设置「AI 模型」中开启。如下拉框为空,联系管理员配置。
## 关闭/隐藏
- 桌面端:浮窗右上角「×」关闭,下次点浮按钮重新打开
- 移动端:浮窗右上角下拉「关闭」

View File

@ -1,47 +0,0 @@
---
id: ai-assistant.feedback.howto
title: 给 AI 回答点赞或点踩
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 点赞
- 点踩
- AI 回答不好怎么反馈
- 反馈 AI 回答
- 有帮助 没帮助
- 复制 AI 回答
- 取消反馈
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 反馈只针对 AI 助手浮窗里的回复,聊天对话里 @AI 机器人的消息暂不支持
- 点踩不会让 AI 立即重新回答,需要自己追问或重新提问
last_verified: v1.7.91
---
# 给 AI 回答点赞或点踩
## 这是什么
AI 助手浮窗中,每条 AI 回复完成后下方右侧会出现「复制 / 有帮助 / 没帮助」三个图标按钮(📋/👍/👎)。复制用于把回复内容复制到剪贴板,👍/👎 用于提交反馈,帮助官方改进 AI 回答质量和帮助文档内容。
## 怎么操作
1. 在 AI 助手浮窗中提问,等待回复完成(流式输出结束后按钮才出现)
2. 回复下方右侧点击 📋(复制)可复制该条回复正文到剪贴板(不含推理过程)
3. 点击 👍(有帮助)或 👎(没帮助)提交反馈
4. 按钮高亮表示已提交;再点另一个按钮可以改票,同一条回复只记最新一次
5. 再次点击当前已高亮的按钮可取消反馈
## 反馈会被怎么用
- 反馈与该回复引用的帮助文档关联,被频繁点踩的文档会被优先修订
- 重新打开历史会话时,之前的反馈状态会保留显示
## 不支持
- 不支持填写文字原因,只有 👍/👎 两档
## 相关
- AI 查帮助文档:[[ai-assistant.search-help-docs.howto]]
- 会话保存:[[ai-assistant.session-save.howto]]

View File

@ -1,59 +0,0 @@
---
id: ai-assistant.float-button.howto
title: 移动 / 收起 AI 助手浮按钮
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 怎么移动 AI 按钮
- AI 球怎么挪
- AI 浮窗按钮位置
- AI 按钮挡住了
- 浮按钮跑哪去了
- 怎么收起 AI 按钮
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 浮按钮无法完全关闭按钮本身(除非卸载 ai 插件或管理员关闭模型)
- 收起后不会自己消失,仍是屏幕边缘一根 48px 高的竖条
- 多端位置不同步:桌面 / 移动 / 桌面 Electron 各自独立存储
last_verified: v1.7.90
---
# 移动 / 收起 AI 助手浮按钮
## 移动位置
### 桌面端
1. 鼠标按住 AI 浮按钮
2. 拖动到任意位置(距屏幕四边至少 12px
3. 松开鼠标完成移动;松手后位置自动写入 IndexedDB
### 移动端
1. 单指按住 AI 浮按钮
2. 拖动到目标位置
3. 抬起手指完成
## 收起 / 展开
- **自动收起**:拖到距屏幕左 / 右边缘 ≤ 12px 时,桌面端 1 秒后自动收起为竖条;移动端首次加载即自动收起到边缘
- **展开**:点一下收起的竖条,按钮重新弹出并打开 AI 助手浮窗
## 怎么判断点击 vs 拖动
- 移动距离 < 5px **且** 按下时间 < 200ms 点击」,呼出 AI 助手
- 否则 → 算「拖动」,只移动位置不打开对话窗
## 不同分辨率
位置只存「距某边距离」+ 「靠哪边」,换屏 / 转屏不会跑到屏外。若发现按钮丢失,刷新页面后会回到默认位置(桌面右下、移动右侧中下)。
## 不支持
- 桌面端没有「关闭浮按钮」的用户开关:要彻底关闭需管理员侧关闭 ai 插件
- 不支持把浮按钮拖到屏幕外(会被边距 12px 强制约束)
- 位置不跨端同步(手机和电脑各自存)
## 相关
- 浮按钮的整体行为:[[ai-assistant.float-button.concept]]
- 进 AI 助手的其他方法:[[ai-assistant.entry.howto]]

View File

@ -1,69 +0,0 @@
---
id: ai-assistant.image-upload.howto
title: 给 AI 助手发图片
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 上传图片
- 给 AI 发截图
- AI 拍照分析
- 粘贴图片给 AI
- 拖图片给 AI
- AI 看图
related_tools: []
related_pages: []
prerequisites:
- 已选中支持视觉的模型(如 gpt-4o / claude-3.5-sonnet / gemini-1.5-pro
negative:
- 单次最多 5 张,超出会拒绝
- 仅支持图片格式image/*),不支持 PDF / 视频
- 图片会被前端压缩到长边 1568px JPEG原图不保留
- 非视觉模型即使选了也会被上游报错或忽略图片
last_verified: v1.7.90
---
# 给 AI 助手发图片
## 三种上传方式
### 1. 点击图片按钮
1. 打开 AI 助手浮窗
2. 浮窗底部输入区**左侧**有图片图标
3. 点击 → 弹系统文件选择器
4. 选 1-5 张图片 → 确定
### 2. 拖放
1. 把图片从桌面或文件管理器拖到 AI 浮窗
2. 浮窗内部出现「松开以上传图片」遮罩
3. 在遮罩内松开鼠标完成上传
### 3. 粘贴Ctrl/Cmd + V
1. 截图Mac Cmd+Shift+4、Win Snipping Tool 等)
2. 焦点放在 AI 输入框
3. 按 Ctrl/Cmd + V剪贴板的图片直接进入预览区
## 数量与压缩规则
- 最多 5 张并存;超出 toast「最多上传 5 张图片」
- 自动压缩:长边 ≤ 1568px、统一转 JPEG
- 节省 token上游按图片像素 / 大小计费
## 预览与移除
- 上传后缩略图出现在输入框上方
- 点缩略图右上角「×」单张移除
- 发送后图片自动从「待发送」区清空
## 发送行为
- 文本 + 图片**同时**作为多模态 content 发送
- 历史会话里图片用占位符 `[image:imageId]` 存到 `data`,实际 base64 入 `images`
- 再次打开历史会话通过 `serverImageMap` 拿 URL 渲染
## 不支持
- 不支持视频 / PDF / 音频
- 不支持把图片拖到收起的浮按钮上(先展开浮窗)
- 不支持「不压缩直发」开关
## 相关
- [[ai-assistant.multimodal.concept]]
- [[ai-assistant.model-switch.howto]]

View File

@ -1,62 +0,0 @@
---
id: ai-assistant.intelligent-search.howto
title: 让 AI 做智能搜索
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 智能搜索
- AI 搜一下
- 全站搜索
- 找一下 X
- 不知道在哪
- 跨模块搜索
related_tools: [intelligent_search]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 只搜当前用户有权访问的内容
- 默认结果上限 20 条,按相关度排序
- 不返回系统设置 / 插件配置等管理项
last_verified: v1.7.90
---
# 让 AI 做智能搜索
## 这是什么
当你不确定要找的东西是任务、项目、文件还是人时,让 AI 调 `intelligent_search` 工具做跨类型语义搜索,结果合并任务 / 项目 / 文件 / 联系人 / 消息五大类,按相关度统一排序。
## 怎么问
- "搜一下『官网改版』有关的所有东西"
- "找下『年终报告』,不管是什么类型"
- "凡是提到上线日期的内容"
- "我想找昨天讨论的接口设计,记不清是文件还是消息"
## 与按类型搜的区别
- **按类型搜**(如 `search_files` / `list_tasks`):你已经知道是文件 / 任务,能给出精确筛选
- **智能搜索**:你只有一个关键词,让 AI 跨类型匹配,相关度排序
## 结果通常长什么样
分组返回:
- 任务(前 N 条)
- 项目(前 N 条)
- 文件(前 N 条)
- 联系人(前 N 条)
- 消息(前 N 条)
每项含标题、摘要、跳转链接,便于继续操作(打开 / 重新讨论 / 转发)。
## 不支持
- 不能跨工作空间 / 跨租户搜索
- 不返回敏感字段(密码、邮箱手机号正文不会出现在摘要)
- 不能精确按数值范围筛(如"金额 > 1000"),需用具体业务工具
## 相关
- 知识库检索:[[ai-assistant.search-help-docs.howto]]
- 找文件:[[ai-assistant.search-files.howto]]
- 找任务:[[ai-assistant.list-tasks.howto]]
- 找人:[[ai-assistant.search-users.howto]]

View File

@ -1,66 +0,0 @@
---
id: ai-assistant.list-tasks.howto
title: 让 AI 列我的任务
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 我今天有什么任务
- 帮我看下任务
- 今天的待办
- 这周要交什么
- 列一下任务
- 给我看待办
- 我有哪些任务
related_tools: [list_tasks]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 只能列出当前登录用户有权访问的任务(项目成员或负责人/协作者/可见用户)
- 一次最多返回 100 条,超出请追加筛选条件
- 不能列别人的私有任务(即便是同部门)
last_verified: v1.7.90
---
# 让 AI 列我的任务
## 这是什么
在 AI 浮窗用自然语言问任务列表AI 会调 `list_tasks` 工具检索后端,按你说的条件筛选并返回结果摘要。结果通常含任务名、负责人、截止时间、所属项目。
## 怎么问
按你想筛的条件直接说:
- "我今天到期的任务"
- "本周要交的任务"
- "项目 X 里我负责的进行中任务"
- "已逾期未完成的任务"
- "上个月完成的任务"
- "标记了高优先级且没人负责的任务"
## AI 通常会问回的信息
模糊提问时AI 可能反问以缩小范围:
- 时间范围(今天/本周/本月/自定义)
- 状态(未开始/进行中/已完成/已逾期)
- 项目限定
- 负责人是不是你
## 后续动作
列出任务后可以接续操作,无需重复说"在 X 项目"
- "把第 2 条标完成" → 调 `complete_task`
- "打开第一条" → AI 在你的页面上跳到任务详情
- "给小王再加一条子任务" → 调 `create_sub_task`
## 不支持
- 不支持跨用户查询别人的任务列表
- 模糊筛选「重要的」「紧急的」不保证命中:依赖任务已设置对应优先级/标签字段
- 不返回已删除任务(除非显式说"被删的任务"
## 相关
- 创建任务:[[ai-assistant.create-task.howto]]
- 子任务建议:[[ai-assistant.subtask-suggest.howto]]
- 打开任务详情:[[ai-assistant.page-action.howto]]

View File

@ -1,59 +0,0 @@
---
id: ai-assistant.model-switch.howto
title: 切换 AI 助手使用的模型
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 怎么换 AI 模型
- 切换模型
- 用 GPT 还是 Claude
- 改用别的 AI
- 模型下拉
related_tools: []
related_pages: []
prerequisites:
- AI 助手浮窗已打开
- 管理员配置了 ≥ 1 个模型
negative:
- 切换模型不会重置当前会话历史,会带着已有 context 直接换模型续聊
- 切模型不会回放之前的回答(不重生成已有的 message
- 不支持把同一个问题同时发到两个模型做对比
last_verified: v1.7.90
---
# 切换 AI 助手使用的模型
## 入口
- 打开 AI 助手浮窗(点浮按钮 / Cmd+I / Ctrl+I
- 浮窗**底部输入区**有一个「模型下拉框」,左侧位置
- 下拉按服务商分组,如 ChatGPT / Claude / DeepSeek 等
## 操作步骤
1. 在浮窗底部点击模型选择下拉框
2. 在分组列表中选目标模型(如 `Claude → claude-3.5-sonnet`
3. 选中后立即生效,下一次发送就用新模型
## 选项排序逻辑
- 服务商按 `openai``claude``deepseek``gemini``grok``ollama``zhipu``qianwen``wenxin` 固定顺序
- 每个服务商分组最多显示 5 个候选 + 1 个管理员设置的默认模型(如不在前 5 内会追加)
- 不在 `AIBotMap` 的自定义服务商按字母序排在最后
## 自动记忆
- 切换后的选择会写入 IndexedDB key `aiAssistant.model`
- 下次打开 AI 助手时自动恢复到上次用过的模型
## 切换后的会话影响
- 历史消息(用户问 + AI 回)保留,会作为 context 发给新模型
- AI 不会重新回答历史问题;只对**下一次新提问**生效
- 多模态:如果切到不支持图片的模型,未来发图会失败(但已有图片预览仍可看)
## 不支持
- 不支持切换后清空历史(要清空需手动新建会话:[[ai-assistant.new-chat.howto]]
- 不支持「这条回答用模型 A下一条用模型 B」的单轮指定
- 不支持下拉为空时自动 fallback下拉空时直接禁用发送详见 [[ai-assistant.model-empty.faq]]
## 相关
- 模型概念与服务商列表:[[ai-assistant.model.concept]]
- 下拉为空:[[ai-assistant.model-empty.faq]]

View File

@ -1,64 +0,0 @@
---
id: ai-assistant.new-chat.howto
title: 新建一个 AI 助手会话
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 新建 AI 会话
- 重新开始 AI
- 开一段新对话
- 清空当前对话
- 不要带上下文
- AI 重新聊
related_tools: []
related_pages: []
prerequisites:
- AI 助手浮窗已打开
negative:
- 新建会话不会删除旧会话,只是把旧会话归档到历史列表
- 新建会话只清空输出区与上下文,不影响模型选择 / 浮按钮位置
- 嵌入入口的「新建」按钮不出现在浮窗,由各业务入口控制
last_verified: v1.7.90
---
# 新建一个 AI 助手会话
## 何时需要新建
- 想换话题,又不希望 AI 受当前会话历史影响
- 当前会话上下文太长,回答变慢或质量下降
- 不想让接下来的提问污染历史
## 入口
1. 打开 AI 助手浮窗
2. 浮窗**右上角操作区**有一个「新建会话」图标
3. 仅当 `sessionEnabled = true` **且**(当前会话有消息 **或** 历史列表非空)时显示
## 行为
点击「新建会话」按钮:
1. 当前会话**自动保存**到历史列表(标题取首条提问前 20 字)
2. 生成新 `session_id`(格式 `session-{时间戳}-{随机串}`
3. 清空 `responses`,页面输出区清空
4. 上下文 context 归零,下一次提问只发当前消息 + 默认 system prompt
5. 当前模型选择保留
## 不会影响什么
- 模型下拉的当前选择
- 浮按钮位置 / 收起状态
- 历史会话列表(仅多一条)
- 图片缓存(已发送过的图片仍可被历史引用)
## 其他「新建」的等价路径
- **删除当前会话**:不想留底就直接删除当前会话,会自动建一个空会话进入(见 [[ai-assistant.session-delete.howto]]
- **切到其他历史会话**:会切走当前会话,但当前会话仍保留在历史里
## 不支持
- 不支持「新建会话同时换模型」(先切模型再新建)
- 不支持「新建空会话但保留前一轮上下文」
- 不支持指定新会话标题(永远自动生成)
## 相关
- [[ai-assistant.session.concept]]
- [[ai-assistant.session-list.howto]]
- [[ai-assistant.session-save.howto]]

View File

@ -1,68 +0,0 @@
---
id: ai-assistant.page-action.howto
title: 让 AI 帮我跳页面/打开任务
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 打开任务
- AI 切换项目
- AI 跳到仪表盘
- 让 AI 帮我开 X
- AI 跳转
- AI 帮我打开
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
- 浏览器/桌面端会话所在页面已加载
negative:
- 只在当前浏览器标签内导航,不会新开标签
- AI 不能打开你没权限访问的资源(会被后端拒绝)
- 若任务被删AI 跳转后会落到 404 / 提示「任务不存在」
last_verified: v1.7.91
---
# 让 AI 帮我跳页面/打开任务
## 这是什么
在 AI 浮窗用自然语言让 AI 把当前页跳转到任务详情、对话、项目、文件预览或功能页。AI 助手会在你当前的浏览器/桌面端页面上执行真实路由跳转。
## 怎么问
- "打开任务 1234"
- "切到项目『官网改版』"
- "打开和小王的对话"
- "帮我打开仪表盘"
- "跳到日历"
- "打开文件 ID 5678"
- "关闭这个应用" / "把当前应用关掉"(打开微应用插件后,可让 AI 直接关闭当前应用窗口,无需自己点关闭按钮)
## 支持的跳转目标
- 任务详情open_task / goto_task / navigate_to_task
- 对话open_dialog可附带 msg_id 跳到指定消息)
- 项目主页open_project
- 文件预览open_file/ 文件夹open_folder
- 功能页:仪表盘 / 消息 / 日历 / 文件管理
## AI 怎么找到目标
- 你给 ID 时直接跳
- 你给名字时 AI 会先调 `list_tasks` / `search_dialogs` / `list_projects` / `search_files` 找候选
- 同名多选时列候选让你确认
## 跳转后还能继续
跳到目标页后,浮窗保持打开,可继续:
- "把它标完成" → 调 `complete_task`
- "看下讨论" → 调 `get_message_list`
- "拉到底部" → AI 在你的页面上滚动到底部
## 不支持
- 不能跳到外部网址(如 google.com
- 不能在新标签打开
- 不能切换到其他用户的视图
## 相关
- 操作页面元素:[[ai-assistant.element-action.howto]]
- 页面操作机制:[[ai-assistant.page-action.concept]]

View File

@ -1,62 +0,0 @@
---
id: ai-assistant.project-init.howto
title: 让 AI 生成项目结构
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 建项目
- AI 生成项目模板
- 项目结构 AI
- AI 帮我搭项目
- 新项目让 AI 写
- 创建项目时的 AI 按钮
related_tools: [create_project, create_task]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已开启至少一个支持 tool call 的模型
negative:
- 仅生成项目骨架(列 + 初始任务),不生成成员/权限设置
- 一次最多生成 5 个列 + 每列 6 条任务,超出请二次追加
- 不会自动创建已存在同名项目(会提示重命名)
last_verified: v1.7.90
---
# 让 AI 生成项目结构
## 这是什么
在「创建项目」弹窗里,项目名输入框右侧有 AI 按钮(仅 ai 插件已装且模型已配置时显示。点击后描述项目目标AI 会调 `create_project` 创建项目,再用 `create_task` 批量写入推荐的列和初始任务。
## 入口
- 桌面端:右上角全局「+」→「创建项目」→ 项目名输入框右侧 AI 图标
- 桌面端:左侧栏「项目」→「+」→「创建项目」→ 同上
- 移动端:「+」→「创建项目」→ AI 按钮
## 操作步骤
1. 打开创建项目弹窗,点项目名旁 AI 按钮
2. 输入项目描述(如"3 个月官网改版,含 UI/前端/后端"
3. AI 生成项目名 + 列结构 + 每列初始任务预览
4. 点「采用并创建」批量建
## AI 输出示例
- **项目名**:官网改版 2026Q1
- **列**:待办 / 设计中 / 开发中 / 测试中 / 已完成
- **任务**:每列 3-6 条按角色分组
## 后续动作
项目创建完成后可继续:
- "把这些任务都分给小王" → 调 `update_task` 批量改负责人
- "再加一个『设计评审』列" → 调列管理工具
- "把项目讨论组拉一下" → AI 暂不能自动建群
## 不支持
- 不能基于其他项目复制(要复制项目请用模板功能)
- AI 不会自动设置任务截止时间,需后续追加
- 创建后想撤销只能手动删项目(无 undo
## 相关
- 浮窗里建单个任务:[[ai-assistant.create-task.howto]]
- 入口总览:[[ai-assistant.entry.howto]]

View File

@ -1,56 +0,0 @@
---
id: ai-assistant.report-draft.howto
title: 用 AI 助手整理工作报告
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 写周报
- AI 生成日报
- 周报模板 AI
- AI 帮我写报告
- 工作总结 AI
- AI 整理汇报怎么用
related_tools: [generate_report_template]
related_pages: []
prerequisites:
- 应用商店(应用市场)已安装 ai 插件
- 管理员已配置至少一个可用 AI 模型
negative:
- AI 做的是「整理润色」,不是从零代写:汇报内容为空时按钮会提示「请先填写汇报内容」
- 整理结果是草稿,需用户人工审阅、修改、手动提交(不自动发送)
- 数据来源是周期内的任务记录,不读群聊
last_verified: v1.7.90
---
# 用 AI 助手整理工作报告
## 这是什么
写工作报告(日报 / 周报)时,可以让 AI 助手基于已填写的汇报内容做整理和润色。新建报告时系统已按你周期内的任务(已完成 / 未完成自动生成内容初稿AI 在此基础上加工,不会替你从零编造。
## 入口
桌面端:工作报告编辑页(「应用」→「工作报告」→ 写报告)底部,「提交」按钮旁的「**AI 整理汇报**」按钮。
## 操作步骤
1. 进入报告编辑页,选择类型(日报 / 周报),系统自动按任务生成汇报内容初稿
2. 先补充 / 修改汇报内容(内容为空时点按钮会提示「请先填写汇报内容」)
3. 点「AI 整理汇报」,弹出 AI 助手浮窗,可输入想强调的重点或特殊说明
4. AI 在已填内容基础上整理、润色、生成总结
5. 把整理结果应用回编辑器,人工检查后点「提交」
## 让结果更贴合需求
在浮窗里补充说明,例如:
- "重点写官网改版项目,其他一笔带过"
- "口语化一点 / 更正式一点"
- "用英文写"
## 不支持
- 不会自动提交(始终需要人工点提交)
- 不会跨用户整理(只能处理自己的报告)
- 汇报内容为空时不能直接生成,必须先填写内容
## 相关
- 报告编辑页按钮详情:[[report.ai-generate.howto]]
- 总结任务:[[ai-assistant.task-summary.howto]]

View File

@ -1,55 +0,0 @@
---
id: ai-assistant.search-files.howto
title: 让 AI 帮我找文件
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 找文件
- 帮我找文档
- AI 查文件
- 我上传过的 X 文件
- 找上次那个表
- 谁分享过 X
related_tools: [search_files]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 仅搜当前用户可见的文件(自己上传的 + 项目共享的 + 群里共享的)
- 不能搜本地未上传到 DooTask 的文件
- 文件内容搜索仅对支持解析的格式有效txt/md/docx/pdf/xlsx 等)
last_verified: v1.7.90
---
# 让 AI 帮我找文件
## 这是什么
在 AI 浮窗描述要找的文件AI 调 `search_files` 工具按文件名 / 内容关键词 / 创建人 / 时间检索,返回文件名、路径、所有者、修改时间,常带跳转链接。
## 怎么问
- "找一下我上周上传的 PRD 文档"
- "搜叫『2026 年规划』的 Excel"
- "项目 X 里所有 .pdf"
- "小王最近共享给我的文件"
- "包含『接口文档』关键字的文件"
## 内容搜索 vs 文件名搜索
- 提问含"文件名"、"叫…"时按文件名匹配
- 提问含"包含…"、"提到…"、"关于…"时按内容关键词匹配(需后端文件内容索引可用)
## 找到文件能继续做什么
- "打开第一个" → AI 在你的页面上跳到文件预览
- "下载它" → AI 会给下载链接(无法直接触发浏览器下载)
- "把摘要发我" → 调 `fetch_file_content` 取文本,再让模型总结
## 不支持
- 不支持搜历史版本/已删除文件(默认过滤)
- 加密文件(如带密码 PDF的内容索引可能为空只能文件名匹配
- 不能跨用户搜别人不共享给你的文件
## 相关
- 取文件文字内容:`fetch_file_content`(暂未单独 chunk
- 跨类型语义搜索:[[ai-assistant.intelligent-search.howto]]

View File

@ -1,56 +0,0 @@
---
id: ai-assistant.search-help-docs.howto
title: AI 帮我查 DooTask 怎么用
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 怎么用 DooTask
- X 在哪
- X 怎么操作
- 帮我查文档
- DooTask 怎么做 X
- 找帮助
related_tools: [search_help_docs]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 知识库只覆盖 DooTask 自身功能,不回答行业知识或通用 IT 问题
- 中英文知识库分别检索,所选会话语种决定查哪边
- 没找到资料时 AI 会明示「未在知识库找到」而不是编造
last_verified: v1.7.90
---
# AI 帮我查 DooTask 怎么用
## 这是什么
当你在 AI 浮窗里问 DooTask 功能怎么用,例如"任务怎么设置可见用户"、"报告模板在哪改"AI 会自动触发 `search_help_docs` 工具,从内置知识库(本仓库)检索相关 chunk再综合给出步骤。
## 怎么触发
直接用自然语言提问,无需特殊指令:
- "如何创建项目?"
- "权限不足提示怎么解决?"
- "看板列怎么加?"
- "微应用是什么?"
- "签到怎么补打?"
## 看 AI 调用了哪些资料
- 浮窗中会出现 `search_help_docs` 工具气泡,展开可看检索关键词
- 回答末尾通常会标注"参考自帮助文档"或附上相关功能名
- 若回答错了,可继续追问"你查到的是哪一篇?"AI 会列出 chunk id
## 让 AI 查得更准的小技巧
- 一次只问一个具体功能,别堆三个问题
- 出错时把错误提示原文贴上AI 会同时去查 FAQ 类 chunk
- 含产品名加上"DooTask"前缀(如"DooTask 的看板")能避开开放知识
## 不支持
- 不支持「教我怎么编程」「我项目用 React 怎么写」等编程问题
- 英文知识库覆盖不全:知识库以中文为主,英文环境检索 en 库时覆盖度可能偏低
## 相关
- 入口:[[ai-assistant.entry.howto]]
- 跨任务/项目/文件的语义搜索:[[ai-assistant.intelligent-search.howto]]

View File

@ -1,61 +0,0 @@
---
id: ai-assistant.search-users.howto
title: 让 AI 帮我找人
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 找人
- AI 查同事
- 帮我找小王
- 找联系人
- 找用户
- 谁是 X 部门负责人
related_tools: [search_users]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
negative:
- 搜索范围受当前用户可见性限制,不能搜到组织外的人
- 同名用户会一并列出,需用工号/部门/邮箱再筛
- 不返回登录密码、手机号等敏感字段
last_verified: v1.7.90
---
# 让 AI 帮我找人
## 这是什么
在 AI 浮窗问人AI 调 `search_users` 工具按关键词、项目成员或对话成员筛选,返回昵称、邮箱、部门、头像等基础信息。常用于"加任务负责人 / 拉群"前的确认。
## 怎么问
- "找一下叫小王的同事"
- "运维部有哪些人"
- "项目『官网改版』里都有谁"
- "群『前端组』里的成员"
- "邮箱含 zhang 的同事"
## 同名怎么办
AI 会列出全部同名候选,附部门/邮箱 hint让你回复"第 2 个"或"运维部那个",再继续后续操作。
## 找到人之后能做什么
- "给他发消息:明天 10 点开会" → 调 `send_message`
- "把他加进这个项目任务的负责人" → 调 `update_task`
- "拉个群把他们都加进去" → 仍需人工操作建群AI 不能自动建群)
## 限制范围
默认搜全组织可见用户。可以加范围词收窄:
- "项目 X 里的"
- "对话 Y 里的"
- "部门 Z 里的"
## 不支持
- 不能搜外部联系人DooTask 没有公网通讯录)
- 不能搜已离职/已禁用账号(默认过滤)
- 不能按"今天在线的人"筛(无该字段)
## 相关
- 发消息:[[ai-assistant.send-message.howto]]
- 创建任务时指派人:[[ai-assistant.create-task.howto]]

View File

@ -1,59 +0,0 @@
---
id: ai-assistant.send-message.howto
title: 让 AI 帮我发消息
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 发消息
- AI 发群
- 帮我发给小王
- AI 自动发通知
- 让 AI 发到群里
- AI 代发
related_tools: [send_message]
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 应用市场已安装 mcp_server 插件
- 当前用户与目标对话/用户已存在会话或有权发起
negative:
- 发送动作以当前登录用户名义执行对方看到的是你发的不是「AI 代发」标签)
- AI 不会未经确认直接发,敏感/长内容会先弹消息预览让你确认
- 不能发送已撤回/未上传完成的图片
last_verified: v1.7.90
---
# 让 AI 帮我发消息
## 这是什么
在 AI 浮窗描述要发的内容和对象AI 会先调 `search_dialogs``search_users` 找到目标对话,再调 `send_message` 把消息发出去。消息以当前登录用户身份发送。
## 怎么问
- "给小王发:会议改到下午 3 点"
- "在『前端组』群里发:今晚 8 点上线,请大家配合"
- "把刚才那个总结发到项目讨论组"
## AI 会先确认
- **接收人/群歧义**:同名时列候选让你挑
- **长消息**:超过 200 字会先在浮窗里贴出预览,等你说「确认发」
- **跨群广播**:一次发多群通常会拆成多次确认
## 发送结果
发送成功后浮窗会显示消息 ID + 时间戳;如果对方禁言/不在好友列表/对话不存在,会回失败原因。
## 后续动作
- "撤回刚才那条" → 调 `update_message``delete_message`(依实现)
- "看下回复" → 调 `get_message_list`
- "发完顺便建个任务跟进" → 调 `create_task`
## 不支持
- 不能发语音/视频通话邀请
- 不能定时发送(无 schedule 工具)
- 不能伪装其他用户发送
- AI 不会自动把"@小王"翻成用户 mention需要明确说"@用户 ID"
## 相关
- 找人:[[ai-assistant.search-users.howto]]
- 任务讨论区 @AI[[ai-assistant.task-mention.howto]]

View File

@ -1,63 +0,0 @@
---
id: ai-assistant.session-delete.howto
title: 删除 AI 助手历史会话
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 删除 AI 历史
- 清空 AI 对话
- 删除 AI 会话
- AI 历史不要了
- 删除 AI 聊天记录
related_tools: []
related_pages: []
prerequisites:
- 当前桶有 ≥ 1 条会话
negative:
- 删除不可恢复,相关图片也会从 public/uploads 物理删除
- 删除单条无二次确认;清空全部有确认弹窗
- 删除当前桶不会影响其他桶
last_verified: v1.7.90
---
# 删除 AI 助手历史会话
## 入口
1. 打开 AI 助手浮窗
2. 浮窗右上角点「历史」图标展开下拉
## 删除单条
1. 鼠标移到目标会话条目上
2. 点条目右侧小垃圾桶图标
3. **立即删除**(无确认):
- 后端调 `POST api/assistant/session/delete`,参数 `{session_key, session_id}`
- 服务端删除会话记录及对应 `public/uploads/assistant/YYYYMM/{userid}/` 图片
- 如果删的是当前打开的会话,自动新建一个空会话替代
## 清空整个桶(全部历史)
1. 历史下拉最底部「清空历史记录」
2. 弹出确认弹窗 → 「确定」
3. 执行:
- 调 `POST api/assistant/session/delete`,参数 `{session_key, clear_all: true}`
- 后端清空当前桶所有会话 + 物理删除所有图片
- 前端清空内存 `imageCache``serverImageMap`
- 自动新建一个空会话进入
## 不影响其他桶
- 浮窗用 `session_key = global`,清空只删 `global`
- 嵌入入口(`project-create``task-add` 等)的会话**不受影响**
## 误删可恢复吗?
**不能。** 删除即写库 `DELETE`,物理删除关联图片,**无回收站、无 30 天保留**。要保留的对话请提前复制到笔记。
## 不支持
- 不支持选择多条批量删除(只能单删或清空全部)
- 不支持「软删除 / 30 天回收」
- 不支持按时间范围筛选删除
## 相关
- [[ai-assistant.session-list.howto]]
- [[ai-assistant.session.concept]]
- [[ai-assistant.new-chat.howto]]

View File

@ -1,70 +0,0 @@
---
id: ai-assistant.session-list.howto
title: 查看 AI 助手历史会话
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 历史会话
- 我之前问过 AI 什么
- 找回 AI 对话
- AI 聊天记录
- 看 AI 历史
related_tools: []
related_pages: []
prerequisites:
- 当前桶至少有 1 条已保存的会话
negative:
- 历史只显示当前用户、当前桶的会话
- 嵌入入口的会话不出现在浮窗历史里
- 历史按更新时间倒序,最近的在上面
last_verified: v1.7.90
---
# 查看 AI 助手历史会话
## 入口
1. 打开 AI 助手浮窗
2. 浮窗**右上角操作区**有「历史」图标
3. 点击展开下拉,列出当前桶内所有已保存会话
仅当桶内有 ≥ 1 条会话时该图标才出现。
## 显示内容
每条会话显示三行:
- 标题:取首条用户消息前 20 字
- 删除按钮(右上角小垃圾桶)
- 更新时间:今天 / 昨天 / MM-DD HH:mm / YYYY-MM-DD HH:mm
排序:按更新时间倒序,最近聊的在最上面。
## 操作步骤
### 切换到某条历史会话
1. 在历史下拉里点要打开的会话标题
2. 当前对话内容自动保存
3. 浮窗输出区切换为该会话的消息流
### 删除单条会话
1. 鼠标移到会话条目上
2. 点条目右侧小垃圾桶图标
3. 立即删除(无二次确认);同时清掉服务端会话图片
### 清空全部历史
1. 历史下拉最底部「清空历史记录」
2. 弹出确认弹窗 → 「确定」
3. 当前桶所有会话被删,图片缓存一并清空
## 数据来源
通过 `POST api/assistant/session/list` 拉取,按当前用户 + 当前 `session_key` 过滤。返回会话最多 20 条(受 `maxSessionsPerKey` 限制)。
## 不支持
- 不支持按关键词搜索历史
- 不支持给会话改名(标题永远是首条提问截取)
- 不支持把历史导出 CSV / 文本
## 相关
- [[ai-assistant.session.concept]]
- [[ai-assistant.session-delete.howto]]
- [[ai-assistant.new-chat.howto]]

View File

@ -1,67 +0,0 @@
---
id: ai-assistant.session-save.howto
title: AI 助手会话自动保存
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 会话保存
- AI 对话留底
- AI 会话不保留
- AI 没保存
- 手动保存 AI
related_tools: []
related_pages: []
prerequisites:
- 会话管理已启用(`sessionEnabled = true`,浮窗自动开启)
negative:
- 没有「立即保存」按钮,全部自动;不会丢失最新一条
- 嵌入入口未传 sessionKey 时不会启用保存(一次性对话)
- streaming / waiting 状态会被归一为 error 再写库,避免重启卡 loading
last_verified: v1.7.90
---
# AI 助手会话自动保存
## 是否需要手动保存
**不需要。** AI 助手浮窗的会话保存全自动。以下时机触发保存:
1. **流式回答完成**AI 最后一个 chunk 到达,标记 `completed` 后立即保存
2. **流式失败 / 用户中断**:归一未完成态为 `error` 后保存
3. **手动新建会话 / 切换会话 / 切桶**:先保存当前会话再切换
4. **常规编辑(删消息、编辑提问)**2 秒防抖批量写入
## 保存到哪
- 数据库表:`ai_assistant_sessions`,按 `userid` 隔离
- 接口:`POST api/assistant/session/save`
- 字段:`session_key``session_id``title``data`JSON 消息流)、`new_images`(新增图片 base64 列表)
## 标题如何生成
- 取首条 `role !== 'system'``prompt` 前 20 字
- 无任何用户提问时显示「新会话」
- 标题不可手动改
## 图片同步上传
- 保存时仅传**本次新增**的图片 base64
- 后端写入 `public/uploads/assistant/YYYYMM/{userid}/xxx.jpg`
- 返回 `image_urls` 映射,前端缓存到 `serverImageMap`,下次打开会话用 URL 显示
## 防抖与容错
- 普通编辑 2 秒防抖
- 流式结束 / 失败立即写入
- 写入失败仅 console.warn下次保存补上
## 什么时候不保存
- 嵌入入口未传 sessionKey → 该入口走「一次性对话」,关闭后不留底
- 当前会话内一条消息都没有 → 不创建空会话记录
## 不支持
- 不支持云端跨用户 / 跨工作区同步
- 不支持「保存到本地文件」选项
- 不支持暂停自动保存
## 相关
- [[ai-assistant.session.concept]]
- [[ai-assistant.session-list.howto]]
- [[ai-assistant.stop.howto]]

View File

@ -1,59 +0,0 @@
---
id: ai-assistant.shortcut.howto
title: 用快捷键呼出 AI 助手
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 助手快捷键
- 怎么用键盘打开 AI
- Cmd I
- Ctrl I
- AI 键盘打开
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
- 管理员已配置至少一个 AI 模型
negative:
- 移动端没有键盘快捷键(用浮按钮 / Tabbar 入口替代)
- 不支持自定义快捷键,固定为 Cmd+I / Ctrl+I
- 在输入法候选状态下按 I 不会触发(不和 IME 抢键位)
last_verified: v1.7.90
---
# 用快捷键呼出 AI 助手
## 快捷键
| 终端 | 快捷键 | 说明 |
|---|---|---|
| macOS桌面 / Web | `Cmd + I` | 全局生效,无需点输入框 |
| Windows / Linux桌面 / Web | `Ctrl + I` | 全局生效 |
| 移动端 | — | 无键盘快捷键 |
## 触发条件
- ai 插件已安装(`microAppsIds.includes('ai')` 为 true
- 当前在已登录页面(路由非 `login`
- 按键时**未同时按 Shift 或 Alt**,否则会落入其他组合(如 Cmd+Shift+I 是浏览器开发者工具)
## 行为
按下快捷键时,等价于点击右上角全局「+」菜单里的「AI 助手」项,会:
1. 阻止浏览器 / Electron 默认行为(如 Safari 的「显示书签栏」)
2. 触发 `openAIAssistantGlobal` 事件
3. 弹出 AI 助手弹窗(默认 modal 形态),自动聚焦到输入框
## 不响应的场景
- 当前页面是登录页 → 不触发
- ai 插件未安装 → 不触发(按键被释放给浏览器)
- 中文 / 日文输入法处于候选字状态 → 不触发
## 不支持
- 无法在「个人设置」改快捷键,键位固定
- 不支持单独的「关闭 AI 助手」快捷键;按 Esc 仅在浮窗模式下关闭
- 移动端长按虚拟键盘 I 不能触发(依赖物理键盘事件)
## 相关
- 完整入口清单:[[ai-assistant.entry.howto]]
- 弹窗形态:[[ai-assistant.modal.concept]]

View File

@ -1,43 +0,0 @@
---
id: ai-assistant.start-guide.howto
title: 让 AI 带我去对应页面(页面深链)
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 带我去
- 带我操作
- 在哪里设置
- 怎么去
- 快捷跳转
related_tools: []
related_pages: []
prerequisites:
- 应用市场已安装 ai 插件
negative:
- 通过聊天对话 @AI 机器人暂不支持页面深链,需在 AI 助手浮窗中使用
last_verified: v1.7.90
---
# 让 AI 带我去对应页面(页面深链)
## 怎么做
1. 打开 AI 助手浮窗(右下角悬浮按钮)
2. 问一个“在哪/怎么去”类问题,例如「在哪里设置端到端加密」「个人资料怎么改」
3. AI 回答里把可跳转的页面/面板渲染成**蓝色链接**,点击即直达那一屏
## 例子
- 问「在哪里设置端到端加密」→ 回答里「系统设置」是蓝色链接,点它直达系统设置页
- 问「怎么改个人资料」→ 点「个人设置」直达个人设置
## 到达之后
深链把你送到对应页面/面板,页面内的具体开关/按钮请按回答里的文字说明自己操作一下即可。
## 链接没出现 / 不可点怎么办
- 不是每个名词都会变成链接,只有命中系统已登记目的地的词才可点,其余是普通文字——可换个更明确的问法(如直接问「系统设置在哪」)
- 若回答说“文档未说明”,多为知识库未覆盖该功能,可点踩 👎 反馈
## 相关
- 深链是什么:[[ai-assistant.guide.concept]]
- 回答不好怎么反馈:[[ai-assistant.feedback.howto]]

View File

@ -1,63 +0,0 @@
---
id: ai-assistant.stop.howto
title: 中断 AI 助手回答
type: howto
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- 停止 AI 回答
- 让 AI 停下来
- 取消 AI 输出
- AI 一直在打字
- 终止流式
- 重发问题
related_tools: []
related_pages: []
prerequisites:
- AI 助手当前有一条流式回答正在输出
negative:
- 中断后的部分回答保留,但状态变为 error不会再续传
- 中断不向上游模型扣费返还(看服务商)
- 不支持「暂停后再继续」,只能停 + 重新提问
last_verified: v1.7.90
---
# 中断 AI 助手回答
## 何时需要中断
- AI 跑偏,回答方向不对,想立即停下重提问
- 模型陷入冗长输出
- 想换个模型重发同一问题
## 入口
当 AI 正在流式输出时,主动中断方式:
1. **新建会话**:右上角「新建会话」会先清掉当前流再开空会话(见 [[ai-assistant.new-chat.howto]]
2. **关闭浮窗**:关闭浮窗会清理所有活跃 SSE 连接(见 [[ai-assistant.close.howto]]
3. **发新问题**:发起新提问会自动清掉同会话的残留 SSE 流
## 中断时发生了什么
1. 前端调 SSE 客户端的 `unsunscribe()` 切断连接
2. 已收到的部分回答rawOutput保留在 message
3. 该 message 的 `status` 立即变为 `error`,附「会话中断」错误文案
4. message 持久化到 session带 error 状态),刷新不会再卡 loading
## 流式中断恢复保护
- 即使页面崩溃 / 刷新,加载会话时如果发现某条 message 仍是 `streaming``waiting`,会自动归一为 `error`
- 避免「永远转圈」(见 `sanitizeResponsesForPersist`
## 重新提问
中断后想重发同一问题:
1. 鼠标移到刚才被中断的提问气泡
2. 点编辑图标 → 修改后再发
3. 或直接在输入框输入新的问题(按 ↑ 可调出最近 50 条历史输入)
## 不支持
- 不支持「暂停 → 继续」,只能停 + 重发
- 不支持只中断单条;同会话所有进行中的流会一起停
- 不支持中断后撤销(再次发送会生成新一条 message
## 相关
- [[ai-assistant.streaming.concept]]
- [[ai-assistant.close.howto]]
- [[ai-assistant.new-chat.howto]]

Some files were not shown because too many files have changed in this diff Show More