@sinm/kai 1.9.2 → 1.10.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +183 -111
- package/dist-cli/kai-cli.js +9858 -7392
- package/dist-electron/renderer/assets/{_baseUniq-CsQsIo3h.js → _baseUniq-TWYIHSYo.js} +1 -1
- package/dist-electron/renderer/assets/_baseUniq-TWYIHSYo.js.gz +0 -0
- package/dist-electron/renderer/assets/{arc-CnDy2qlp.js → arc-CC0XHE9s.js} +1 -1
- package/dist-electron/renderer/assets/arc-CC0XHE9s.js.gz +0 -0
- package/dist-electron/renderer/assets/{architectureDiagram-Q4EWVU46-7xdcupg1.js → architectureDiagram-Q4EWVU46-Db99kceI.js} +5 -5
- package/dist-electron/renderer/assets/architectureDiagram-Q4EWVU46-Db99kceI.js.gz +0 -0
- package/dist-electron/renderer/assets/{blockDiagram-DXYQGD6D-NHzIf6KM.js → blockDiagram-DXYQGD6D-BiHxnzw6.js} +6 -6
- package/dist-electron/renderer/assets/blockDiagram-DXYQGD6D-BiHxnzw6.js.gz +0 -0
- package/dist-electron/renderer/assets/{c4Diagram-AHTNJAMY-C805hJap.js → c4Diagram-AHTNJAMY-DXZwk3Wh.js} +2 -2
- package/dist-electron/renderer/assets/c4Diagram-AHTNJAMY-DXZwk3Wh.js.gz +0 -0
- package/dist-electron/renderer/assets/{channel-yHIQhPj2.js → channel-BfTEjFDO.js} +1 -1
- package/dist-electron/renderer/assets/{chunk-4BX2VUAB-BW86W7DE.js → chunk-4BX2VUAB-BbzW3sxS.js} +1 -1
- package/dist-electron/renderer/assets/{chunk-4TB4RGXK-CiAgH5vp.js → chunk-4TB4RGXK-Bp0IvYVD.js} +5 -5
- package/dist-electron/renderer/assets/chunk-4TB4RGXK-Bp0IvYVD.js.gz +0 -0
- package/dist-electron/renderer/assets/{chunk-55IACEB6-CLYAwM0u.js → chunk-55IACEB6--tHMS1Fu.js} +1 -1
- package/dist-electron/renderer/assets/{chunk-EDXVE4YY-SvJyEgqT.js → chunk-EDXVE4YY-C37AT76M.js} +1 -1
- package/dist-electron/renderer/assets/chunk-EDXVE4YY-C37AT76M.js.gz +0 -0
- package/dist-electron/renderer/assets/{chunk-FMBD7UC4-CTX3SpFe.js → chunk-FMBD7UC4-BmPFBz66.js} +1 -1
- package/dist-electron/renderer/assets/{chunk-OYMX7WX6-yuicy5fD.js → chunk-OYMX7WX6-BK02zRf3.js} +3 -3
- package/dist-electron/renderer/assets/chunk-OYMX7WX6-BK02zRf3.js.gz +0 -0
- package/dist-electron/renderer/assets/{chunk-QZHKN3VN-8uwLkZ2k.js → chunk-QZHKN3VN-DQblzVJ3.js} +1 -1
- package/dist-electron/renderer/assets/{chunk-YZCP3GAM-BOYtvFmP.js → chunk-YZCP3GAM-BBLOUO8q.js} +1 -1
- package/dist-electron/renderer/assets/chunk-YZCP3GAM-BBLOUO8q.js.gz +0 -0
- package/dist-electron/renderer/assets/{classDiagram-6PBFFD2Q-DdqJHrBR.js → classDiagram-6PBFFD2Q-GoIp7NtF.js} +6 -6
- package/dist-electron/renderer/assets/{classDiagram-v2-HSJHXN6E-DdqJHrBR.js → classDiagram-v2-HSJHXN6E-GoIp7NtF.js} +6 -6
- package/dist-electron/renderer/assets/{clone-CohPIibk.js → clone-DsJHPXSI.js} +1 -1
- package/dist-electron/renderer/assets/{cose-bilkent-S5V4N54A-B1jjJbx2.js → cose-bilkent-S5V4N54A-Bx3Btq3m.js} +1 -1
- package/dist-electron/renderer/assets/cose-bilkent-S5V4N54A-Bx3Btq3m.js.gz +0 -0
- package/dist-electron/renderer/assets/{dagre-KV5264BT-Cr1UGppV.js → dagre-KV5264BT-UjO7D81D.js} +6 -6
- package/dist-electron/renderer/assets/dagre-KV5264BT-UjO7D81D.js.gz +0 -0
- package/dist-electron/renderer/assets/{diagram-5BDNPKRD-OQB6O17M.js → diagram-5BDNPKRD-Qnftph66.js} +6 -6
- package/dist-electron/renderer/assets/diagram-5BDNPKRD-Qnftph66.js.gz +0 -0
- package/dist-electron/renderer/assets/{diagram-G4DWMVQ6-B992OGq3.js → diagram-G4DWMVQ6-hAHLQAYy.js} +6 -6
- package/dist-electron/renderer/assets/diagram-G4DWMVQ6-hAHLQAYy.js.gz +0 -0
- package/dist-electron/renderer/assets/{diagram-MMDJMWI5-sfDZyGEc.js → diagram-MMDJMWI5-B3L74K7n.js} +5 -5
- package/dist-electron/renderer/assets/diagram-MMDJMWI5-B3L74K7n.js.gz +0 -0
- package/dist-electron/renderer/assets/{diagram-TYMM5635-SAOHwHvV.js → diagram-TYMM5635-D-tCCI8y.js} +5 -5
- package/dist-electron/renderer/assets/diagram-TYMM5635-D-tCCI8y.js.gz +0 -0
- package/dist-electron/renderer/assets/{erDiagram-SMLLAGMA-B3lOLLG4.js → erDiagram-SMLLAGMA-BaVMPxLl.js} +4 -4
- package/dist-electron/renderer/assets/erDiagram-SMLLAGMA-BaVMPxLl.js.gz +0 -0
- package/dist-electron/renderer/assets/{flowDiagram-DWJPFMVM-DM8NWY2I.js → flowDiagram-DWJPFMVM-DZpn2G84.js} +6 -6
- package/dist-electron/renderer/assets/flowDiagram-DWJPFMVM-DZpn2G84.js.gz +0 -0
- package/dist-electron/renderer/assets/{ganttDiagram-T4ZO3ILL-Ck9cM-4F.js → ganttDiagram-T4ZO3ILL-BoSD-fWq.js} +2 -2
- package/dist-electron/renderer/assets/ganttDiagram-T4ZO3ILL-BoSD-fWq.js.gz +0 -0
- package/dist-electron/renderer/assets/{gitGraphDiagram-UUTBAWPF-BbTlLKCx.js → gitGraphDiagram-UUTBAWPF-Bsenwzpz.js} +6 -6
- package/dist-electron/renderer/assets/gitGraphDiagram-UUTBAWPF-Bsenwzpz.js.gz +0 -0
- package/dist-electron/renderer/assets/{graph-SD4HIKJw.js → graph-CAbnGHSS.js} +2 -2
- package/dist-electron/renderer/assets/graph-CAbnGHSS.js.gz +0 -0
- package/dist-electron/renderer/assets/{index-CHaHfSLU.js → index-3-RVvi2_.js} +4686 -3039
- package/dist-electron/renderer/assets/index-3-RVvi2_.js.gz +0 -0
- package/dist-electron/renderer/assets/{index-CP1VBw7a.css → index-CmcRKBhc.css} +2066 -1449
- package/dist-electron/renderer/assets/index-CmcRKBhc.css.gz +0 -0
- package/dist-electron/renderer/assets/{infoDiagram-42DDH7IO-DyxtiwFL.js → infoDiagram-42DDH7IO-Dv3v-UTu.js} +4 -4
- package/dist-electron/renderer/assets/{ishikawaDiagram-UXIWVN3A-BUrLWa0T.js → ishikawaDiagram-UXIWVN3A-C0dzSTBj.js} +1 -1
- package/dist-electron/renderer/assets/ishikawaDiagram-UXIWVN3A-C0dzSTBj.js.gz +0 -0
- package/dist-electron/renderer/assets/{journeyDiagram-VCZTEJTY-BMmtCdj3.js → journeyDiagram-VCZTEJTY-qIcnACCb.js} +4 -4
- package/dist-electron/renderer/assets/journeyDiagram-VCZTEJTY-qIcnACCb.js.gz +0 -0
- package/dist-electron/renderer/assets/{kanban-definition-6JOO6SKY-OQBC48Se.js → kanban-definition-6JOO6SKY-BE7SkXi1.js} +2 -2
- package/dist-electron/renderer/assets/kanban-definition-6JOO6SKY-BE7SkXi1.js.gz +0 -0
- package/dist-electron/renderer/assets/{layout-D2Rz390M.js → layout-B9EpUKCa.js} +4 -4
- package/dist-electron/renderer/assets/layout-B9EpUKCa.js.gz +0 -0
- package/dist-electron/renderer/assets/{linear-CQh0Mysb.js → linear-CCyL68xZ.js} +1 -1
- package/dist-electron/renderer/assets/linear-CCyL68xZ.js.gz +0 -0
- package/dist-electron/renderer/assets/{min-DlS-oIeB.js → min-BYrYl2E1.js} +2 -2
- package/dist-electron/renderer/assets/min-BYrYl2E1.js.gz +0 -0
- package/dist-electron/renderer/assets/{mindmap-definition-QFDTVHPH-aTTTq6Nc.js → mindmap-definition-QFDTVHPH-CSoYt4jB.js} +3 -3
- package/dist-electron/renderer/assets/mindmap-definition-QFDTVHPH-CSoYt4jB.js.gz +0 -0
- package/dist-electron/renderer/assets/{pieDiagram-DEJITSTG-n1e04sg0.js → pieDiagram-DEJITSTG-DpGySR6o.js} +6 -6
- package/dist-electron/renderer/assets/pieDiagram-DEJITSTG-DpGySR6o.js.gz +0 -0
- package/dist-electron/renderer/assets/{quadrantDiagram-34T5L4WZ-C-xW2Cqp.js → quadrantDiagram-34T5L4WZ-63fCuOAt.js} +2 -2
- package/dist-electron/renderer/assets/quadrantDiagram-34T5L4WZ-63fCuOAt.js.gz +0 -0
- package/dist-electron/renderer/assets/{requirementDiagram-MS252O5E-pnNGwrTw.js → requirementDiagram-MS252O5E-BJPp47kS.js} +3 -3
- package/dist-electron/renderer/assets/requirementDiagram-MS252O5E-BJPp47kS.js.gz +0 -0
- package/dist-electron/renderer/assets/{sankeyDiagram-XADWPNL6-CbT_Xb_y.js → sankeyDiagram-XADWPNL6-DTh3hGLh.js} +1 -1
- package/dist-electron/renderer/assets/{sankeyDiagram-XADWPNL6-CbT_Xb_y.js.gz → sankeyDiagram-XADWPNL6-DTh3hGLh.js.gz} +0 -0
- package/dist-electron/renderer/assets/{sequenceDiagram-FGHM5R23-a-9UfTJq.js → sequenceDiagram-FGHM5R23-0cxZIN2-.js} +3 -3
- package/dist-electron/renderer/assets/sequenceDiagram-FGHM5R23-0cxZIN2-.js.gz +0 -0
- package/dist-electron/renderer/assets/{stateDiagram-FHFEXIEX-LL3JhZd4.js → stateDiagram-FHFEXIEX-kMxLUpUn.js} +8 -8
- package/dist-electron/renderer/assets/stateDiagram-FHFEXIEX-kMxLUpUn.js.gz +0 -0
- package/dist-electron/renderer/assets/{stateDiagram-v2-QKLJ7IA2-BQfhbm-p.js → stateDiagram-v2-QKLJ7IA2-BZxbk8dA.js} +4 -4
- package/dist-electron/renderer/assets/{timeline-definition-GMOUNBTQ-DeBW6Or5.js → timeline-definition-GMOUNBTQ-Br1nJvtz.js} +2 -2
- package/dist-electron/renderer/assets/timeline-definition-GMOUNBTQ-Br1nJvtz.js.gz +0 -0
- package/dist-electron/renderer/assets/{vennDiagram-DHZGUBPP-DEq9JF1i.js → vennDiagram-DHZGUBPP-DDvLCVqL.js} +1 -1
- package/dist-electron/renderer/assets/vennDiagram-DHZGUBPP-DDvLCVqL.js.gz +0 -0
- package/dist-electron/renderer/assets/{wardley-RL74JXVD-ChJWklYY.js → wardley-RL74JXVD-8Clcfhfi.js} +3 -3
- package/dist-electron/renderer/assets/wardley-RL74JXVD-8Clcfhfi.js.gz +0 -0
- package/dist-electron/renderer/assets/{wardleyDiagram-NUSXRM2D-CIROAFHI.js → wardleyDiagram-NUSXRM2D-8FAhGkRL.js} +5 -5
- package/dist-electron/renderer/assets/wardleyDiagram-NUSXRM2D-8FAhGkRL.js.gz +0 -0
- package/dist-electron/renderer/assets/{xychartDiagram-5P7HB3ND-BedH4Z65.js → xychartDiagram-5P7HB3ND-BowiCO1z.js} +2 -2
- package/dist-electron/renderer/assets/xychartDiagram-5P7HB3ND-BowiCO1z.js.gz +0 -0
- package/dist-electron/renderer/index.html +2 -2
- package/package.json +2 -2
- package/dist-electron/renderer/assets/_baseUniq-CsQsIo3h.js.gz +0 -0
- package/dist-electron/renderer/assets/arc-CnDy2qlp.js.gz +0 -0
- package/dist-electron/renderer/assets/architectureDiagram-Q4EWVU46-7xdcupg1.js.gz +0 -0
- package/dist-electron/renderer/assets/blockDiagram-DXYQGD6D-NHzIf6KM.js.gz +0 -0
- package/dist-electron/renderer/assets/c4Diagram-AHTNJAMY-C805hJap.js.gz +0 -0
- package/dist-electron/renderer/assets/chunk-4TB4RGXK-CiAgH5vp.js.gz +0 -0
- package/dist-electron/renderer/assets/chunk-EDXVE4YY-SvJyEgqT.js.gz +0 -0
- package/dist-electron/renderer/assets/chunk-OYMX7WX6-yuicy5fD.js.gz +0 -0
- package/dist-electron/renderer/assets/chunk-YZCP3GAM-BOYtvFmP.js.gz +0 -0
- package/dist-electron/renderer/assets/cose-bilkent-S5V4N54A-B1jjJbx2.js.gz +0 -0
- package/dist-electron/renderer/assets/dagre-KV5264BT-Cr1UGppV.js.gz +0 -0
- package/dist-electron/renderer/assets/diagram-5BDNPKRD-OQB6O17M.js.gz +0 -0
- package/dist-electron/renderer/assets/diagram-G4DWMVQ6-B992OGq3.js.gz +0 -0
- package/dist-electron/renderer/assets/diagram-MMDJMWI5-sfDZyGEc.js.gz +0 -0
- package/dist-electron/renderer/assets/diagram-TYMM5635-SAOHwHvV.js.gz +0 -0
- package/dist-electron/renderer/assets/erDiagram-SMLLAGMA-B3lOLLG4.js.gz +0 -0
- package/dist-electron/renderer/assets/flowDiagram-DWJPFMVM-DM8NWY2I.js.gz +0 -0
- package/dist-electron/renderer/assets/ganttDiagram-T4ZO3ILL-Ck9cM-4F.js.gz +0 -0
- package/dist-electron/renderer/assets/gitGraphDiagram-UUTBAWPF-BbTlLKCx.js.gz +0 -0
- package/dist-electron/renderer/assets/graph-SD4HIKJw.js.gz +0 -0
- package/dist-electron/renderer/assets/index-CHaHfSLU.js.gz +0 -0
- package/dist-electron/renderer/assets/index-CP1VBw7a.css.gz +0 -0
- package/dist-electron/renderer/assets/ishikawaDiagram-UXIWVN3A-BUrLWa0T.js.gz +0 -0
- package/dist-electron/renderer/assets/journeyDiagram-VCZTEJTY-BMmtCdj3.js.gz +0 -0
- package/dist-electron/renderer/assets/kanban-definition-6JOO6SKY-OQBC48Se.js.gz +0 -0
- package/dist-electron/renderer/assets/layout-D2Rz390M.js.gz +0 -0
- package/dist-electron/renderer/assets/linear-CQh0Mysb.js.gz +0 -0
- package/dist-electron/renderer/assets/min-DlS-oIeB.js.gz +0 -0
- package/dist-electron/renderer/assets/mindmap-definition-QFDTVHPH-aTTTq6Nc.js.gz +0 -0
- package/dist-electron/renderer/assets/pieDiagram-DEJITSTG-n1e04sg0.js.gz +0 -0
- package/dist-electron/renderer/assets/quadrantDiagram-34T5L4WZ-C-xW2Cqp.js.gz +0 -0
- package/dist-electron/renderer/assets/requirementDiagram-MS252O5E-pnNGwrTw.js.gz +0 -0
- package/dist-electron/renderer/assets/sequenceDiagram-FGHM5R23-a-9UfTJq.js.gz +0 -0
- package/dist-electron/renderer/assets/stateDiagram-FHFEXIEX-LL3JhZd4.js.gz +0 -0
- package/dist-electron/renderer/assets/timeline-definition-GMOUNBTQ-DeBW6Or5.js.gz +0 -0
- package/dist-electron/renderer/assets/vennDiagram-DHZGUBPP-DEq9JF1i.js.gz +0 -0
- package/dist-electron/renderer/assets/wardley-RL74JXVD-ChJWklYY.js.gz +0 -0
- package/dist-electron/renderer/assets/wardleyDiagram-NUSXRM2D-CIROAFHI.js.gz +0 -0
- package/dist-electron/renderer/assets/xychartDiagram-5P7HB3ND-BedH4Z65.js.gz +0 -0
package/README.md
CHANGED
|
@@ -2,32 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
> 开启思考。不是帮你做事,是帮你想得更深、更远。
|
|
4
4
|
|
|
5
|
-
KAi 是一款**多 AI Agent
|
|
5
|
+
KAi 是一款**多 AI Agent 协作桌面应用**。你创建的每个 Agent 都有独立的记忆、工作空间和能力边界——它们像一支真正的团队一样协作。
|
|
6
|
+
|
|
7
|
+
**一个人,一支团队。**
|
|
6
8
|
|
|
7
9
|
## 为什么
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
通用聊天助手的问题不是不聪明,而是没有结构:它什么都能答,却没有稳定身份、长期记忆、职责边界和团队协作。
|
|
10
12
|
|
|
11
|
-
KAi
|
|
12
|
-
|
|
13
|
-
**一个人,一支团队。**
|
|
13
|
+
KAi 的答案是 Agent 团队。你可以让一个「乔布斯」负责产品判断,一个「Anders Hejlsberg」把控类型和架构,一个「TJ Holowaychuk」快速落地,一个「Robert C. Martin」做代码审查。它们各有各的工作空间、记忆、工具和性格;它们会 @mention 彼此,会 handoff,会广播讨论,也会把子任务分派给后台 Agent。
|
|
14
14
|
|
|
15
15
|
## 特性
|
|
16
16
|
|
|
17
17
|
### 🧠 Agent 系统
|
|
18
18
|
|
|
19
|
-
- **独立身份** — 每个 Agent
|
|
20
|
-
- **持久记忆** — Agent 自主维护 MEMORY.md
|
|
21
|
-
-
|
|
22
|
-
-
|
|
19
|
+
- **独立身份** — 每个 Agent 有自己的名字、头像、描述和 SOUL(行为准则)。
|
|
20
|
+
- **持久记忆** — Agent 自主维护 `MEMORY.md` 和每日笔记,跨会话保留上下文。
|
|
21
|
+
- **独立工作空间** — 每个 Agent 拥有自己的文件工作区:`~/.kai/agents/{agentId}/workspace/`。
|
|
22
|
+
- **能力边界** — 可为 Agent 分配 Skills、MCP 服务、禁用工具和监督参数。
|
|
23
23
|
|
|
24
24
|
### 👥 多 Agent 协作
|
|
25
25
|
|
|
26
|
-
-
|
|
27
|
-
- **
|
|
28
|
-
-
|
|
29
|
-
- **
|
|
30
|
-
-
|
|
26
|
+
- **Session 化对话** — 单聊和群聊都以 Session 为主概念;一个群组可拥有多个隔离 Session。
|
|
27
|
+
- **单聊多 Session** — 同一个 Agent 可并行开启多个讨论,适合把不同任务、分支思路和长期陪跑拆开。
|
|
28
|
+
- **Handoff 交接** — Agent 可以主动交接任务,并附带原因和上下文摘要。
|
|
29
|
+
- **@mention** — 在消息中 @ 指定 Agent,触发协作或路由。
|
|
30
|
+
- **Broadcast 广播** — 一次问题并行询问多个 Agent,聚合不同专业判断。
|
|
31
|
+
- **子任务分派** — Agent 可以创建前台或后台任务,委托其他 Agent 执行。
|
|
32
|
+
- **Supervisor 监督** — 指定监督者评估执行结果,决定继续、重试、跳过、修订或终止。
|
|
31
33
|
|
|
32
34
|
### 🛠 内置工具
|
|
33
35
|
|
|
@@ -36,44 +38,62 @@ Agent 开箱即用的能力:
|
|
|
36
38
|
| 工具 | 功能 |
|
|
37
39
|
|------|------|
|
|
38
40
|
| **Shell** | 执行终端命令 |
|
|
39
|
-
| **
|
|
41
|
+
| **File Tools** | 安全读写和精确编辑本地文件 |
|
|
40
42
|
| **Web Search** | 网络搜索 |
|
|
41
43
|
| **Web Fetch** | 抓取和解析网页内容 |
|
|
42
|
-
| **Database** |
|
|
44
|
+
| **Database** | 只读查询应用数据库 |
|
|
43
45
|
| **Scheduler** | 创建和管理定时任务 |
|
|
44
|
-
| **Skill** |
|
|
45
|
-
| **MCP** | 通过 Model Context Protocol
|
|
46
|
+
| **Skill** | 按需加载技能包 |
|
|
47
|
+
| **MCP** | 通过 Model Context Protocol 连接外部工具服务 |
|
|
48
|
+
| **Image** | 图片识别与图片生成 |
|
|
46
49
|
|
|
47
50
|
### 💬 聊天体验
|
|
48
51
|
|
|
49
|
-
- 流式输出,实时渲染 Markdown / 代码高亮 /
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
52
|
+
- 流式输出,实时渲染 Markdown / 代码高亮 / 推理过程。
|
|
53
|
+
- 支持图片、文件附件和多模态消息。
|
|
54
|
+
- 工具调用、任务结果、广播结果以结构化卡片展示,并展示状态与耗时。
|
|
55
|
+
- 群聊与单聊都支持顶部 Session Tabs:新建、切换、重命名、归档。
|
|
56
|
+
- 快捷回复支持独立 `⚡` 入口;`/` 命令保留给真正的命令。
|
|
57
|
+
- 明暗主题自适应。
|
|
58
|
+
- 中英文国际化(i18n)。
|
|
59
|
+
|
|
60
|
+
### 🔌 连接与自动化
|
|
61
|
+
|
|
62
|
+
- **模型通道** — 支持主模型、备用模型、自动 fallback 和健康状态记录。
|
|
63
|
+
- **模型能力学习** — 根据真实报错学习上下文窗口 / 最大输出限制,自动修正后重试。
|
|
64
|
+
- **MCP 服务** — 在设置中添加 MCP 服务,并一键应用到指定 Agent。
|
|
65
|
+
- **Bot 接入** — 支持外部频道接入,让 Agent 不只活在桌面窗口里。
|
|
66
|
+
- **远程访问** — 可通过远程入口访问本地 KAi。
|
|
67
|
+
- **定时任务** — 定期触发消息、记忆整理或自动化工作流。
|
|
68
|
+
- **自动更新** — 桌面应用支持检查更新、下载进度和安装更新。
|
|
53
69
|
|
|
54
70
|
## 技术栈
|
|
55
71
|
|
|
56
|
-
```
|
|
57
|
-
Electron
|
|
72
|
+
```text
|
|
73
|
+
Electron 42 + React 19 + TypeScript 5
|
|
58
74
|
Vercel AI SDK + SQLite3 + Zustand + CSS Modules
|
|
59
|
-
electron-vite + Vitest
|
|
75
|
+
electron-vite + Vitest + Playwright
|
|
60
76
|
```
|
|
61
77
|
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
78
|
+
- **运行形态**:Electron 桌面应用 + CLI + 本地 telemetry dashboard
|
|
79
|
+
- **Core**:Agent / Message / Tool / Skill 等领域逻辑与端口接口。
|
|
80
|
+
- **Adapters**:LLM、MCP、DB、文件存储、工具、调度器、外部频道等具体实现。
|
|
81
|
+
- **Electron Main**:应用启动、IPC、自动更新、崩溃日志、远程访问。
|
|
82
|
+
- **Renderer**:React UI,沙箱化运行(`contextIsolation: true`)。
|
|
83
|
+
- **Preload**:通过 `contextBridge` 暴露受控 API。
|
|
84
|
+
- **CLI**:复用核心链路的命令行入口。
|
|
65
85
|
|
|
66
86
|
## 快速开始
|
|
67
87
|
|
|
68
88
|
### 环境要求
|
|
69
89
|
|
|
70
90
|
- Node.js >= 22
|
|
71
|
-
- Yarn
|
|
91
|
+
- Yarn 1.x
|
|
72
92
|
|
|
73
93
|
### 安装
|
|
74
94
|
|
|
75
95
|
```bash
|
|
76
|
-
git clone https://github.com/
|
|
96
|
+
git clone https://github.com/pansinm/kai.git
|
|
77
97
|
cd kai
|
|
78
98
|
yarn install
|
|
79
99
|
```
|
|
@@ -81,66 +101,139 @@ yarn install
|
|
|
81
101
|
### 开发
|
|
82
102
|
|
|
83
103
|
```bash
|
|
84
|
-
yarn dev
|
|
104
|
+
yarn dev
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### CLI
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
yarn build:cli
|
|
111
|
+
npx @sinm/kai@latest start --port 9529
|
|
85
112
|
```
|
|
86
113
|
|
|
87
|
-
###
|
|
114
|
+
### 构建与打包
|
|
88
115
|
|
|
89
116
|
```bash
|
|
90
|
-
yarn build #
|
|
91
|
-
yarn package #
|
|
117
|
+
yarn build # 构建 Electron 应用
|
|
118
|
+
yarn package # 打包当前平台安装包,输出到 release/
|
|
119
|
+
yarn build:cli # 构建 CLI
|
|
92
120
|
```
|
|
93
121
|
|
|
94
122
|
### 测试
|
|
95
123
|
|
|
96
124
|
```bash
|
|
97
|
-
yarn test
|
|
98
|
-
|
|
99
|
-
|
|
125
|
+
yarn test # Vitest
|
|
126
|
+
npx tsc --noEmit -p tsconfig.web.json
|
|
127
|
+
npx tsc --noEmit -p tsconfig.node.json
|
|
128
|
+
yarn test:e2e # 内部会先执行 yarn build
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
发布前建议按这个顺序跑完整门禁:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npx tsc --noEmit -p tsconfig.web.json
|
|
135
|
+
npx tsc --noEmit -p tsconfig.node.json
|
|
136
|
+
yarn test
|
|
137
|
+
yarn test:e2e
|
|
100
138
|
```
|
|
101
139
|
|
|
102
140
|
## 架构
|
|
103
141
|
|
|
142
|
+
KAi 的代码按职责分层,而不是按运行环境硬塞在一起:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
src/
|
|
146
|
+
├── core/ # 领域核心:Agent、Message、Tools、Skill、Workspace
|
|
147
|
+
├── adapters/ # 适配器:LLM、DB、MCP、Storage、Tools、Scheduler、Channel
|
|
148
|
+
├── electron/ # Electron 主进程、preload、updater、crash、remote
|
|
149
|
+
├── renderer/ # React 渲染进程
|
|
150
|
+
├── shared/ # 共享类型、配置、工具函数
|
|
151
|
+
├── app/ # 应用 bootstrap
|
|
152
|
+
├── cli/ # CLI 入口
|
|
153
|
+
└── telemetry-server/ # 遥测服务端
|
|
154
|
+
```
|
|
155
|
+
|
|
104
156
|
### Agent 执行层
|
|
105
157
|
|
|
158
|
+
```text
|
|
159
|
+
SoloExecutor # 单 Agent 对话
|
|
160
|
+
SwarmExecutor # 多 Agent 协作编排:handoff / task / broadcast / supervisor
|
|
161
|
+
├── TaskOrchestrator # 子任务与广播任务编排
|
|
162
|
+
├── SwarmContext # 协作运行态:handoff chain、task map 等
|
|
163
|
+
└── AgentExecutor # 当前生产执行器:流式模型调用、工具循环、fallback、压缩
|
|
164
|
+
|
|
165
|
+
AgentLoop # 正在演进的新执行循环抽象:retry / stopWhen / tool loop / usage collect
|
|
166
|
+
└── AgentKernel # 单次模型调用内核:streamText、工具调用投影、tool-call repair
|
|
106
167
|
```
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
168
|
+
|
|
169
|
+
### 消息与 Session
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
User Input
|
|
173
|
+
→ window.api.sendUserMessage()
|
|
174
|
+
→ MessageQueue
|
|
175
|
+
→ MessageProcessor
|
|
176
|
+
→ SoloChat / GroupChat
|
|
177
|
+
→ SoloExecutor / SwarmExecutor
|
|
178
|
+
→ LLM + Tools
|
|
179
|
+
→ ConversationEvent stream
|
|
180
|
+
→ Zustand Store
|
|
181
|
+
→ React UI
|
|
113
182
|
```
|
|
114
183
|
|
|
184
|
+
- 单聊与群聊都以 `Session` 作为主要运行单元。
|
|
185
|
+
- 单聊的 Session 归属于某个 Agent;群组的 Session 归属于某个 Group。
|
|
186
|
+
- `speaker` 是群组 Session 级状态,而不是全局群组状态。
|
|
187
|
+
- 消息仍由 SQLite 持久化;长上下文由文件 `context.json` 保存。
|
|
188
|
+
|
|
115
189
|
### 消息压缩管线
|
|
116
190
|
|
|
117
|
-
|
|
191
|
+
长对话自动压缩,按成本从低到高处理:
|
|
118
192
|
|
|
119
|
-
```
|
|
120
|
-
ToolResultSpill
|
|
121
|
-
→ ReasoningRemoval
|
|
122
|
-
→ Summarization
|
|
123
|
-
→ Pruning
|
|
193
|
+
```text
|
|
194
|
+
ToolResultSpill
|
|
195
|
+
→ ReasoningRemoval
|
|
196
|
+
→ Summarization
|
|
197
|
+
→ Pruning
|
|
124
198
|
```
|
|
125
199
|
|
|
126
200
|
### 数据存储
|
|
127
201
|
|
|
128
|
-
```
|
|
202
|
+
```text
|
|
129
203
|
~/.kai/
|
|
130
|
-
├── kai.db
|
|
131
|
-
├── config/
|
|
204
|
+
├── kai.db # SQLite:消息等结构化数据
|
|
205
|
+
├── config/ # 应用配置,加密存储 API Key
|
|
206
|
+
├── direct-sessions/
|
|
207
|
+
│ └── {sessionId}/
|
|
208
|
+
│ └── context.json # 单聊 Session 上下文
|
|
132
209
|
├── agents/
|
|
133
210
|
│ └── {agentId}/
|
|
134
|
-
│
|
|
135
|
-
│
|
|
136
|
-
│
|
|
137
|
-
│
|
|
138
|
-
│ ├──
|
|
139
|
-
│ ├──
|
|
140
|
-
│ ├──
|
|
141
|
-
│
|
|
142
|
-
├──
|
|
143
|
-
|
|
211
|
+
│ ├── meta.json # Agent 身份
|
|
212
|
+
│ ├── config.json # 模型、fallback、skills、MCP、禁用工具等能力配置
|
|
213
|
+
│ ├── context.json # legacy 单聊上下文兼容文件
|
|
214
|
+
│ └── workspace/
|
|
215
|
+
│ ├── IDENTITY.md
|
|
216
|
+
│ ├── SOUL.md
|
|
217
|
+
│ ├── USER.md
|
|
218
|
+
│ ├── MEMORY.md
|
|
219
|
+
│ ├── AGENTS.md
|
|
220
|
+
│ ├── TOOLS.md
|
|
221
|
+
│ └── memory/
|
|
222
|
+
├── groups/
|
|
223
|
+
│ └── {groupId}/
|
|
224
|
+
│ ├── meta.json
|
|
225
|
+
│ ├── config.json
|
|
226
|
+
│ ├── members.json
|
|
227
|
+
│ ├── GROUP_SETTINGS.md # 人可写,AI 只读
|
|
228
|
+
│ ├── GROUP_MEMORY.md # 群长期记忆
|
|
229
|
+
│ ├── memory/ # 群每日记忆
|
|
230
|
+
│ └── sessions/
|
|
231
|
+
│ └── {sessionId}/
|
|
232
|
+
│ ├── meta.json
|
|
233
|
+
│ ├── config.json
|
|
234
|
+
│ └── context.json # 群组 Session 上下文
|
|
235
|
+
├── conversations/ # 追加式消息日志(jsonl,兼容运行链路)
|
|
236
|
+
└── attachments/ # 对话附件
|
|
144
237
|
```
|
|
145
238
|
|
|
146
239
|
## 支持的 LLM
|
|
@@ -150,69 +243,48 @@ KAi 通过 Vercel AI SDK 连接大语言模型,支持:
|
|
|
150
243
|
- OpenAI Compatible(OpenAI、DeepSeek、Moonshot、MiniMax 等)
|
|
151
244
|
- Anthropic Claude
|
|
152
245
|
- Google Gemini
|
|
153
|
-
- 任何兼容 OpenAI API
|
|
246
|
+
- 任何兼容 OpenAI API 的模型服务
|
|
154
247
|
|
|
155
|
-
|
|
248
|
+
在设置的「模型通道」中配置 API Key 即可使用。
|
|
156
249
|
|
|
157
250
|
## MCP(Model Context Protocol)
|
|
158
251
|
|
|
159
|
-
KAi 内置 MCP
|
|
252
|
+
KAi 内置 MCP 客户端。在设置中添加 MCP 服务,然后应用到指定 Agent;只有被授权的 Agent 才会看到对应 MCP 工具。
|
|
253
|
+
|
|
254
|
+
示例配置形态:
|
|
160
255
|
|
|
161
256
|
```json
|
|
162
257
|
{
|
|
163
|
-
"
|
|
164
|
-
|
|
165
|
-
"my-server": {
|
|
166
|
-
"command": "npx",
|
|
167
|
-
"args": ["-y", "@my/mcp-server"]
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
258
|
+
"command": "npx",
|
|
259
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
|
|
171
260
|
}
|
|
172
261
|
```
|
|
173
262
|
|
|
174
|
-
## 项目结构
|
|
175
|
-
|
|
176
|
-
```
|
|
177
|
-
src/
|
|
178
|
-
├── main/ # Electron 主进程
|
|
179
|
-
│ ├── agent/ # Agent 执行引擎
|
|
180
|
-
│ │ ├── SoloExecutor # 单 Agent 执行器
|
|
181
|
-
│ │ ├── SwarmExecutor # 群聊执行器
|
|
182
|
-
│ │ ├── AgentExecutor # LLM 调用执行器
|
|
183
|
-
│ │ ├── SupervisorLoop # 监督循环
|
|
184
|
-
│ │ ├── TaskOrchestrator # 任务编排
|
|
185
|
-
│ │ ├── SwarmContext # 共享上下文
|
|
186
|
-
│ │ ├── HandoffResolver # Handoff 解析
|
|
187
|
-
│ │ └── factory/ # Prompt/Tools 构建
|
|
188
|
-
│ ├── compression/ # 消息压缩管线
|
|
189
|
-
│ ├── config/ # 配置管理(加密)
|
|
190
|
-
│ ├── db/ # SQLite 数据层
|
|
191
|
-
│ ├── handlers/ # IPC 处理器
|
|
192
|
-
│ ├── mcp/ # MCP 客户端
|
|
193
|
-
│ ├── scheduler/ # 定时任务系统
|
|
194
|
-
│ ├── skill/ # Skill 技能系统
|
|
195
|
-
│ ├── storage/ # 会话/附件存储
|
|
196
|
-
│ ├── tools/ # 内置工具
|
|
197
|
-
│ └── workspace/ # Agent 工作空间管理
|
|
198
|
-
├── renderer/ # React 渲染进程
|
|
199
|
-
│ └── src/
|
|
200
|
-
│ ├── components/ # UI 组件
|
|
201
|
-
│ ├── stores/ # Zustand 状态管理
|
|
202
|
-
│ ├── locales/ # i18n 翻译文件
|
|
203
|
-
│ └── styles/ # 设计令牌 + CSS Modules
|
|
204
|
-
├── preload/ # 安全桥接层
|
|
205
|
-
└── shared/ # 主进程/渲染进程共享类型
|
|
206
|
-
```
|
|
207
|
-
|
|
208
263
|
## 安全模型
|
|
209
264
|
|
|
210
265
|
KAi 采用 Electron 三进程安全架构:
|
|
211
266
|
|
|
212
|
-
-
|
|
213
|
-
- **预加载层**:`contextIsolation: true` + `nodeIntegration: false
|
|
214
|
-
-
|
|
215
|
-
-
|
|
267
|
+
- **渲染进程**:沙箱化,无 Node.js 直接访问。
|
|
268
|
+
- **预加载层**:`contextIsolation: true` + `nodeIntegration: false`。
|
|
269
|
+
- **主进程**:文件系统、网络、数据库和工具调用通过 IPC 受控暴露。
|
|
270
|
+
- **文件工具**:要求绝对 `workdir` + 相对 `path`,拒绝路径逃逸。
|
|
271
|
+
- **数据库工具**:只允许只读查询。
|
|
272
|
+
- **API Key**:使用本地 salt + machineId 派生密钥,并通过 AES-256-GCM 加密存储。
|
|
273
|
+
|
|
274
|
+
## 项目文档
|
|
275
|
+
|
|
276
|
+
- [功能清单](docs/features.md) — 从用户视角查看当前已实现能力
|
|
277
|
+
- [文档索引](docs/README.md) — architecture / design / workflow 等入口
|
|
278
|
+
- [Release Notes](RELEASE_NOTES.md) — 已发布版本记录
|
|
279
|
+
|
|
280
|
+
## 进一步阅读
|
|
281
|
+
|
|
282
|
+
- [架构文档](docs/architecture/architecture.md)
|
|
283
|
+
- [功能清单](docs/features.md)
|
|
284
|
+
- [发版流程](docs/workflow/发版流程.md)
|
|
285
|
+
- [基于 worktree 的开发流程](docs/workflow/ai-worktree-workflow.md)
|
|
286
|
+
- [Swarm Supervisor 设计](docs/design/swarm-supervisor-design.md)
|
|
287
|
+
- [Agent Kernel / Loop 设计](docs/design/agent-kernel-loop-design.md)
|
|
216
288
|
|
|
217
289
|
## License
|
|
218
290
|
|