@sinm/kai 1.9.0 → 1.9.3

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.
Files changed (134) hide show
  1. package/README.md +152 -111
  2. package/dist-cli/kai-cli.js +2024 -887
  3. package/dist-electron/renderer/assets/{_baseUniq-wFb12gB-.js → _baseUniq-DoVY4MSS.js} +1 -1
  4. package/dist-electron/renderer/assets/_baseUniq-DoVY4MSS.js.gz +0 -0
  5. package/dist-electron/renderer/assets/{arc-Bjp2aBSU.js → arc--9SigsrL.js} +1 -1
  6. package/dist-electron/renderer/assets/arc--9SigsrL.js.gz +0 -0
  7. package/dist-electron/renderer/assets/{architectureDiagram-Q4EWVU46-AEAF6BMT.js → architectureDiagram-Q4EWVU46-B2-KW8QI.js} +5 -5
  8. package/dist-electron/renderer/assets/architectureDiagram-Q4EWVU46-B2-KW8QI.js.gz +0 -0
  9. package/dist-electron/renderer/assets/{blockDiagram-DXYQGD6D-CZGyJqzN.js → blockDiagram-DXYQGD6D-CY8AyV-u.js} +6 -6
  10. package/dist-electron/renderer/assets/blockDiagram-DXYQGD6D-CY8AyV-u.js.gz +0 -0
  11. package/dist-electron/renderer/assets/{c4Diagram-AHTNJAMY-QR6T5UK-.js → c4Diagram-AHTNJAMY-fsUL-kLH.js} +2 -2
  12. package/dist-electron/renderer/assets/c4Diagram-AHTNJAMY-fsUL-kLH.js.gz +0 -0
  13. package/dist-electron/renderer/assets/{channel-Bqk4dDiH.js → channel-DFRrClya.js} +1 -1
  14. package/dist-electron/renderer/assets/{chunk-4BX2VUAB-Ql_0mvKl.js → chunk-4BX2VUAB-C_b460N6.js} +1 -1
  15. package/dist-electron/renderer/assets/{chunk-4TB4RGXK-DcpxCTnt.js → chunk-4TB4RGXK-DznBU0eC.js} +5 -5
  16. package/dist-electron/renderer/assets/chunk-4TB4RGXK-DznBU0eC.js.gz +0 -0
  17. package/dist-electron/renderer/assets/{chunk-55IACEB6-5i5ku6Mp.js → chunk-55IACEB6-BEn8Gyw6.js} +1 -1
  18. package/dist-electron/renderer/assets/{chunk-EDXVE4YY-DWU8RPW7.js → chunk-EDXVE4YY-C6Ylq851.js} +1 -1
  19. package/dist-electron/renderer/assets/chunk-EDXVE4YY-C6Ylq851.js.gz +0 -0
  20. package/dist-electron/renderer/assets/{chunk-FMBD7UC4-CGgyRi9w.js → chunk-FMBD7UC4-CNXONWYO.js} +1 -1
  21. package/dist-electron/renderer/assets/{chunk-OYMX7WX6-DsuO_QrB.js → chunk-OYMX7WX6-DDnf0PhN.js} +3 -3
  22. package/dist-electron/renderer/assets/chunk-OYMX7WX6-DDnf0PhN.js.gz +0 -0
  23. package/dist-electron/renderer/assets/{chunk-QZHKN3VN-Bbii2TV9.js → chunk-QZHKN3VN-B_Fq1xCk.js} +1 -1
  24. package/dist-electron/renderer/assets/{chunk-YZCP3GAM-DBLeyzP3.js → chunk-YZCP3GAM-DBTMP9qR.js} +1 -1
  25. package/dist-electron/renderer/assets/chunk-YZCP3GAM-DBTMP9qR.js.gz +0 -0
  26. package/dist-electron/renderer/assets/{classDiagram-6PBFFD2Q-CTppFDM-.js → classDiagram-6PBFFD2Q-hV0XpFcD.js} +6 -6
  27. package/dist-electron/renderer/assets/{classDiagram-v2-HSJHXN6E-CTppFDM-.js → classDiagram-v2-HSJHXN6E-hV0XpFcD.js} +6 -6
  28. package/dist-electron/renderer/assets/{clone-DJcYmsl6.js → clone-CaObVnzv.js} +1 -1
  29. package/dist-electron/renderer/assets/{cose-bilkent-S5V4N54A-lOBC_Swy.js → cose-bilkent-S5V4N54A-YSGABmDO.js} +1 -1
  30. package/dist-electron/renderer/assets/cose-bilkent-S5V4N54A-YSGABmDO.js.gz +0 -0
  31. package/dist-electron/renderer/assets/{dagre-KV5264BT-CFc-IlN0.js → dagre-KV5264BT-D-_h7-5B.js} +6 -6
  32. package/dist-electron/renderer/assets/dagre-KV5264BT-D-_h7-5B.js.gz +0 -0
  33. package/dist-electron/renderer/assets/{diagram-5BDNPKRD-CMjGq3Qd.js → diagram-5BDNPKRD-DUw8aQXg.js} +6 -6
  34. package/dist-electron/renderer/assets/diagram-5BDNPKRD-DUw8aQXg.js.gz +0 -0
  35. package/dist-electron/renderer/assets/{diagram-G4DWMVQ6-BZ_RCuPz.js → diagram-G4DWMVQ6-B9hMMSLk.js} +6 -6
  36. package/dist-electron/renderer/assets/diagram-G4DWMVQ6-B9hMMSLk.js.gz +0 -0
  37. package/dist-electron/renderer/assets/{diagram-MMDJMWI5-CAbPKB-M.js → diagram-MMDJMWI5-D-3rSXTw.js} +5 -5
  38. package/dist-electron/renderer/assets/diagram-MMDJMWI5-D-3rSXTw.js.gz +0 -0
  39. package/dist-electron/renderer/assets/{diagram-TYMM5635-CUDsp3Va.js → diagram-TYMM5635-DUP-PBv8.js} +5 -5
  40. package/dist-electron/renderer/assets/diagram-TYMM5635-DUP-PBv8.js.gz +0 -0
  41. package/dist-electron/renderer/assets/{erDiagram-SMLLAGMA-DoaAVQ3k.js → erDiagram-SMLLAGMA-DytsFZ__.js} +4 -4
  42. package/dist-electron/renderer/assets/erDiagram-SMLLAGMA-DytsFZ__.js.gz +0 -0
  43. package/dist-electron/renderer/assets/{flowDiagram-DWJPFMVM-BPPswghk.js → flowDiagram-DWJPFMVM-CzO3oLSq.js} +6 -6
  44. package/dist-electron/renderer/assets/flowDiagram-DWJPFMVM-CzO3oLSq.js.gz +0 -0
  45. package/dist-electron/renderer/assets/{ganttDiagram-T4ZO3ILL-D9dDRsnt.js → ganttDiagram-T4ZO3ILL-V2OtiUyi.js} +2 -2
  46. package/dist-electron/renderer/assets/ganttDiagram-T4ZO3ILL-V2OtiUyi.js.gz +0 -0
  47. package/dist-electron/renderer/assets/{gitGraphDiagram-UUTBAWPF-BqSxB4JC.js → gitGraphDiagram-UUTBAWPF-Bda-RK4T.js} +6 -6
  48. package/dist-electron/renderer/assets/gitGraphDiagram-UUTBAWPF-Bda-RK4T.js.gz +0 -0
  49. package/dist-electron/renderer/assets/{graph-Cdcjro9E.js → graph-D-bM-Zax.js} +2 -2
  50. package/dist-electron/renderer/assets/graph-D-bM-Zax.js.gz +0 -0
  51. package/dist-electron/renderer/assets/{index-DR-b90MW.js → index-B6AlLjch.js} +3952 -2668
  52. package/dist-electron/renderer/assets/index-B6AlLjch.js.gz +0 -0
  53. package/dist-electron/renderer/assets/{index-DIbFt7rO.css → index-C4yFAlqR.css} +1994 -1411
  54. package/dist-electron/renderer/assets/index-C4yFAlqR.css.gz +0 -0
  55. package/dist-electron/renderer/assets/{infoDiagram-42DDH7IO-BNgkgl2w.js → infoDiagram-42DDH7IO-D2kpJRbq.js} +4 -4
  56. package/dist-electron/renderer/assets/{ishikawaDiagram-UXIWVN3A-B2smtRtE.js → ishikawaDiagram-UXIWVN3A-Dkw87Tbt.js} +1 -1
  57. package/dist-electron/renderer/assets/ishikawaDiagram-UXIWVN3A-Dkw87Tbt.js.gz +0 -0
  58. package/dist-electron/renderer/assets/{journeyDiagram-VCZTEJTY-5i0hgzSw.js → journeyDiagram-VCZTEJTY-qJprDQ3l.js} +4 -4
  59. package/dist-electron/renderer/assets/journeyDiagram-VCZTEJTY-qJprDQ3l.js.gz +0 -0
  60. package/dist-electron/renderer/assets/{kanban-definition-6JOO6SKY-DZ82Qc3W.js → kanban-definition-6JOO6SKY-CMq0peT3.js} +2 -2
  61. package/dist-electron/renderer/assets/kanban-definition-6JOO6SKY-CMq0peT3.js.gz +0 -0
  62. package/dist-electron/renderer/assets/{layout-DCDaRhDD.js → layout-CxXj_FIV.js} +4 -4
  63. package/dist-electron/renderer/assets/layout-CxXj_FIV.js.gz +0 -0
  64. package/dist-electron/renderer/assets/{linear-BhTANRPL.js → linear-CtYMnotP.js} +1 -1
  65. package/dist-electron/renderer/assets/linear-CtYMnotP.js.gz +0 -0
  66. package/dist-electron/renderer/assets/{min-fI6oHIzD.js → min-Bqf3mXd1.js} +2 -2
  67. package/dist-electron/renderer/assets/min-Bqf3mXd1.js.gz +0 -0
  68. package/dist-electron/renderer/assets/{mindmap-definition-QFDTVHPH-CFwqVKXp.js → mindmap-definition-QFDTVHPH-4RDe2kUB.js} +3 -3
  69. package/dist-electron/renderer/assets/mindmap-definition-QFDTVHPH-4RDe2kUB.js.gz +0 -0
  70. package/dist-electron/renderer/assets/{pieDiagram-DEJITSTG-B9qNWsik.js → pieDiagram-DEJITSTG-BCR81MRq.js} +6 -6
  71. package/dist-electron/renderer/assets/pieDiagram-DEJITSTG-BCR81MRq.js.gz +0 -0
  72. package/dist-electron/renderer/assets/{quadrantDiagram-34T5L4WZ-BH52I9Mz.js → quadrantDiagram-34T5L4WZ-Bpmh-XvR.js} +2 -2
  73. package/dist-electron/renderer/assets/quadrantDiagram-34T5L4WZ-Bpmh-XvR.js.gz +0 -0
  74. package/dist-electron/renderer/assets/{requirementDiagram-MS252O5E-zdr-UweE.js → requirementDiagram-MS252O5E-DNvlS_Mc.js} +3 -3
  75. package/dist-electron/renderer/assets/requirementDiagram-MS252O5E-DNvlS_Mc.js.gz +0 -0
  76. package/dist-electron/renderer/assets/{sankeyDiagram-XADWPNL6-fOSi4otN.js → sankeyDiagram-XADWPNL6-CIr3ReOD.js} +1 -1
  77. package/dist-electron/renderer/assets/sankeyDiagram-XADWPNL6-CIr3ReOD.js.gz +0 -0
  78. package/dist-electron/renderer/assets/{sequenceDiagram-FGHM5R23-BD9MRuC5.js → sequenceDiagram-FGHM5R23-DXmMVdpu.js} +3 -3
  79. package/dist-electron/renderer/assets/sequenceDiagram-FGHM5R23-DXmMVdpu.js.gz +0 -0
  80. package/dist-electron/renderer/assets/{stateDiagram-FHFEXIEX-CMQH2Bdw.js → stateDiagram-FHFEXIEX-BXC-CMaD.js} +8 -8
  81. package/dist-electron/renderer/assets/stateDiagram-FHFEXIEX-BXC-CMaD.js.gz +0 -0
  82. package/dist-electron/renderer/assets/{stateDiagram-v2-QKLJ7IA2-B4Kz8yNI.js → stateDiagram-v2-QKLJ7IA2-Cik6aC4X.js} +4 -4
  83. package/dist-electron/renderer/assets/{timeline-definition-GMOUNBTQ-eOylFnoH.js → timeline-definition-GMOUNBTQ-dWERylNQ.js} +2 -2
  84. package/dist-electron/renderer/assets/timeline-definition-GMOUNBTQ-dWERylNQ.js.gz +0 -0
  85. package/dist-electron/renderer/assets/{vennDiagram-DHZGUBPP-CYDW0VBV.js → vennDiagram-DHZGUBPP-CuO9YmxO.js} +1 -1
  86. package/dist-electron/renderer/assets/vennDiagram-DHZGUBPP-CuO9YmxO.js.gz +0 -0
  87. package/dist-electron/renderer/assets/{wardley-RL74JXVD-CYRSMbSd.js → wardley-RL74JXVD-bHTvhGGa.js} +3 -3
  88. package/dist-electron/renderer/assets/wardley-RL74JXVD-bHTvhGGa.js.gz +0 -0
  89. package/dist-electron/renderer/assets/{wardleyDiagram-NUSXRM2D-jjE8DGWF.js → wardleyDiagram-NUSXRM2D-B8WNKIUZ.js} +5 -5
  90. package/dist-electron/renderer/assets/wardleyDiagram-NUSXRM2D-B8WNKIUZ.js.gz +0 -0
  91. package/dist-electron/renderer/assets/{xychartDiagram-5P7HB3ND-BJCCYED3.js → xychartDiagram-5P7HB3ND-D6pt_QSE.js} +2 -2
  92. package/dist-electron/renderer/assets/xychartDiagram-5P7HB3ND-D6pt_QSE.js.gz +0 -0
  93. package/dist-electron/renderer/index.html +2 -2
  94. package/package.json +1 -1
  95. package/dist-electron/renderer/assets/_baseUniq-wFb12gB-.js.gz +0 -0
  96. package/dist-electron/renderer/assets/arc-Bjp2aBSU.js.gz +0 -0
  97. package/dist-electron/renderer/assets/architectureDiagram-Q4EWVU46-AEAF6BMT.js.gz +0 -0
  98. package/dist-electron/renderer/assets/blockDiagram-DXYQGD6D-CZGyJqzN.js.gz +0 -0
  99. package/dist-electron/renderer/assets/c4Diagram-AHTNJAMY-QR6T5UK-.js.gz +0 -0
  100. package/dist-electron/renderer/assets/chunk-4TB4RGXK-DcpxCTnt.js.gz +0 -0
  101. package/dist-electron/renderer/assets/chunk-EDXVE4YY-DWU8RPW7.js.gz +0 -0
  102. package/dist-electron/renderer/assets/chunk-OYMX7WX6-DsuO_QrB.js.gz +0 -0
  103. package/dist-electron/renderer/assets/chunk-YZCP3GAM-DBLeyzP3.js.gz +0 -0
  104. package/dist-electron/renderer/assets/cose-bilkent-S5V4N54A-lOBC_Swy.js.gz +0 -0
  105. package/dist-electron/renderer/assets/dagre-KV5264BT-CFc-IlN0.js.gz +0 -0
  106. package/dist-electron/renderer/assets/diagram-5BDNPKRD-CMjGq3Qd.js.gz +0 -0
  107. package/dist-electron/renderer/assets/diagram-G4DWMVQ6-BZ_RCuPz.js.gz +0 -0
  108. package/dist-electron/renderer/assets/diagram-MMDJMWI5-CAbPKB-M.js.gz +0 -0
  109. package/dist-electron/renderer/assets/diagram-TYMM5635-CUDsp3Va.js.gz +0 -0
  110. package/dist-electron/renderer/assets/erDiagram-SMLLAGMA-DoaAVQ3k.js.gz +0 -0
  111. package/dist-electron/renderer/assets/flowDiagram-DWJPFMVM-BPPswghk.js.gz +0 -0
  112. package/dist-electron/renderer/assets/ganttDiagram-T4ZO3ILL-D9dDRsnt.js.gz +0 -0
  113. package/dist-electron/renderer/assets/gitGraphDiagram-UUTBAWPF-BqSxB4JC.js.gz +0 -0
  114. package/dist-electron/renderer/assets/graph-Cdcjro9E.js.gz +0 -0
  115. package/dist-electron/renderer/assets/index-DIbFt7rO.css.gz +0 -0
  116. package/dist-electron/renderer/assets/index-DR-b90MW.js.gz +0 -0
  117. package/dist-electron/renderer/assets/ishikawaDiagram-UXIWVN3A-B2smtRtE.js.gz +0 -0
  118. package/dist-electron/renderer/assets/journeyDiagram-VCZTEJTY-5i0hgzSw.js.gz +0 -0
  119. package/dist-electron/renderer/assets/kanban-definition-6JOO6SKY-DZ82Qc3W.js.gz +0 -0
  120. package/dist-electron/renderer/assets/layout-DCDaRhDD.js.gz +0 -0
  121. package/dist-electron/renderer/assets/linear-BhTANRPL.js.gz +0 -0
  122. package/dist-electron/renderer/assets/min-fI6oHIzD.js.gz +0 -0
  123. package/dist-electron/renderer/assets/mindmap-definition-QFDTVHPH-CFwqVKXp.js.gz +0 -0
  124. package/dist-electron/renderer/assets/pieDiagram-DEJITSTG-B9qNWsik.js.gz +0 -0
  125. package/dist-electron/renderer/assets/quadrantDiagram-34T5L4WZ-BH52I9Mz.js.gz +0 -0
  126. package/dist-electron/renderer/assets/requirementDiagram-MS252O5E-zdr-UweE.js.gz +0 -0
  127. package/dist-electron/renderer/assets/sankeyDiagram-XADWPNL6-fOSi4otN.js.gz +0 -0
  128. package/dist-electron/renderer/assets/sequenceDiagram-FGHM5R23-BD9MRuC5.js.gz +0 -0
  129. package/dist-electron/renderer/assets/stateDiagram-FHFEXIEX-CMQH2Bdw.js.gz +0 -0
  130. package/dist-electron/renderer/assets/timeline-definition-GMOUNBTQ-eOylFnoH.js.gz +0 -0
  131. package/dist-electron/renderer/assets/vennDiagram-DHZGUBPP-CYDW0VBV.js.gz +0 -0
  132. package/dist-electron/renderer/assets/wardley-RL74JXVD-CYRSMbSd.js.gz +0 -0
  133. package/dist-electron/renderer/assets/wardleyDiagram-NUSXRM2D-jjE8DGWF.js.gz +0 -0
  134. package/dist-electron/renderer/assets/xychartDiagram-5P7HB3ND-BJCCYED3.js.gz +0 -0
package/README.md CHANGED
@@ -2,32 +2,33 @@
2
2
 
3
3
  > 开启思考。不是帮你做事,是帮你想得更深、更远。
4
4
 
5
- KAi 是一款**多 AI Agent 协作桌面应用**。你可以创建多个拥有独立人格、记忆和技能的 Agent,让它们在你的桌面上像一个真正的团队一样协作——讨论、交接、互审、分工。
5
+ KAi 是一款**多 AI Agent 协作桌面应用**。你创建的每个 Agent 都有独立的记忆、工作空间和能力边界——它们像一支真正的团队一样协作。
6
6
 
7
- ## 为什么
7
+ **一个人,一支团队。**
8
8
 
9
- ChatGPT 聊天,你得到的是一个无所不能但什么都记不住的通用助手。
9
+ ## 为什么
10
10
 
11
- KAi 不一样。你可以让一个"乔布斯"负责产品思考,一个"Anders Hejlsberg"把控架构,一个"TJ Holowaychuk"写代码,一个"Robert C. Martin"写审查。它们各有各的记忆、工具权限和个性。它们会 @mention 彼此,会交接任务,会监督结果。
11
+ 通用聊天助手的问题不是不聪明,而是没有结构:它什么都能答,却没有稳定身份、长期记忆、职责边界和团队协作。
12
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 有自己的名字、头像、个性描述,甚至可以自定义 SOUL(行为准则)
20
- - **持久记忆** — Agent 自主维护 MEMORY.md(长期记忆)和每日笔记,跨会话记住上下文
21
- - **工作空间** — 每个 Agent 拥有独立的文件工作空间(`~/.kai/agents/{id}/workspace/`)
22
- - **Skill 技能系统** 可扩展的技能包,Agent 按需加载,提升专业领域表现
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
- - **群聊模式**多个 Agent 在同一个对话中协作,支持 sequential / parallel / broadcast 策略
27
- - **Handoff 交接** — Agent 之间可以主动交接任务,附带原因和上下文摘要
28
- - **@mention** — 在回复中 `@AgentName` 触发自动交接
29
- - **Supervisor 监督**指定一个 Agent 作为监督者,评估执行结果是否达成目标
30
- - **子任务分派** — Agent 可以创建前台/后台子任务,委托给其他 Agent 执行
26
+ - **群聊与线程**Group 是团队,Thread 是讨论现场;一个 Group 可拥有多个隔离线程。
27
+ - **Handoff 交接** — Agent 可以主动交接任务,并附带原因和上下文摘要。
28
+ - **@mention** — 在消息中 @ 指定 Agent,触发协作或路由。
29
+ - **Broadcast 广播**一次问题并行询问多个 Agent,聚合不同专业判断。
30
+ - **子任务分派** — Agent 可以创建前台或后台任务,委托其他 Agent 执行。
31
+ - **Supervisor 监督** — 指定监督者评估执行结果,决定继续、重试、跳过、修订或终止。
31
32
 
32
33
  ### 🛠 内置工具
33
34
 
@@ -36,44 +37,58 @@ Agent 开箱即用的能力:
36
37
  | 工具 | 功能 |
37
38
  |------|------|
38
39
  | **Shell** | 执行终端命令 |
39
- | **Read/Write/Edit File** | 读写和精确编辑本地文件 |
40
+ | **File Tools** | 安全读写和精确编辑本地文件 |
40
41
  | **Web Search** | 网络搜索 |
41
42
  | **Web Fetch** | 抓取和解析网页内容 |
42
- | **Database** | 查询应用数据库(只读) |
43
+ | **Database** | 只读查询应用数据库 |
43
44
  | **Scheduler** | 创建和管理定时任务 |
44
- | **Skill** | 加载和执行技能包 |
45
- | **MCP** | 通过 Model Context Protocol 连接外部工具服务器 |
45
+ | **Skill** | 按需加载技能包 |
46
+ | **MCP** | 通过 Model Context Protocol 连接外部工具服务 |
47
+ | **Image** | 图片识别与图片生成 |
46
48
 
47
49
  ### 💬 聊天体验
48
50
 
49
- - 流式输出,实时渲染 Markdown / 代码高亮 / 推理过程
50
- - 支持图片附件
51
- - 明暗主题自适应
52
- - 中英文国际化(i18n)
51
+ - 流式输出,实时渲染 Markdown / 代码高亮 / 推理过程。
52
+ - 支持图片、文件附件和多模态消息。
53
+ - 工具调用、任务结果、广播结果以结构化卡片展示。
54
+ - 明暗主题自适应。
55
+ - 中英文国际化(i18n)。
56
+
57
+ ### 🔌 连接与自动化
58
+
59
+ - **模型通道** — 支持主模型、备用模型、自动 fallback 和健康状态记录。
60
+ - **MCP 服务** — 在设置中添加 MCP 服务,并一键应用到指定 Agent。
61
+ - **Bot 接入** — 支持外部频道接入,让 Agent 不只活在桌面窗口里。
62
+ - **远程访问** — 可通过远程入口访问本地 KAi。
63
+ - **定时任务** — 定期触发消息、记忆整理或自动化工作流。
64
+ - **自动更新** — 桌面应用支持检查更新、下载进度和安装更新。
53
65
 
54
66
  ## 技术栈
55
67
 
56
- ```
57
- Electron 40 + React 19 + TypeScript 5
68
+ ```text
69
+ Electron 42 + React 19 + TypeScript 5
58
70
  Vercel AI SDK + SQLite3 + Zustand + CSS Modules
59
- electron-vite + Vitest
71
+ electron-vite + Vitest + Playwright
60
72
  ```
61
73
 
62
- - **主进程**:Agent 执行引擎、IPC、数据库、文件系统、MCP 客户端
63
- - **渲染进程**:React UI,沙箱化运行(`contextIsolation: true`)
64
- - **预加载层**:`contextBridge` 安全桥接
74
+ - **Core**:Agent / Message / Tool / Skill 等领域逻辑与端口接口。
75
+ - **Adapters**:LLM、MCP、DB、文件存储、工具、调度器、外部频道等具体实现。
76
+ - **Electron Main**:应用启动、IPC、自动更新、崩溃日志、远程访问。
77
+ - **Renderer**:React UI,沙箱化运行(`contextIsolation: true`)。
78
+ - **Preload**:通过 `contextBridge` 暴露受控 API。
79
+ - **CLI**:复用核心链路的命令行入口。
65
80
 
66
81
  ## 快速开始
67
82
 
68
83
  ### 环境要求
69
84
 
70
85
  - Node.js >= 22
71
- - Yarn
86
+ - Yarn 1.x
72
87
 
73
88
  ### 安装
74
89
 
75
90
  ```bash
76
- git clone https://github.com/your-org/kai.git
91
+ git clone https://github.com/pansinm/kai.git
77
92
  cd kai
78
93
  yarn install
79
94
  ```
@@ -81,66 +96,119 @@ yarn install
81
96
  ### 开发
82
97
 
83
98
  ```bash
84
- yarn dev # 启动开发服务器(支持 HMR)
99
+ yarn dev
85
100
  ```
86
101
 
87
- ### 构建
102
+ ### 构建与打包
88
103
 
89
104
  ```bash
90
- yarn build # 构建生产版本
91
- yarn package # 打包为平台安装包(输出到 release/)
105
+ yarn build # 构建 Electron 应用
106
+ yarn package # 打包当前平台安装包,输出到 release/
107
+ yarn build:cli # 构建 CLI
92
108
  ```
93
109
 
94
110
  ### 测试
95
111
 
96
112
  ```bash
97
- yarn test # 运行测试
98
- yarn test:ui # 测试 UI
99
- yarn test:coverage # 覆盖率报告
113
+ yarn test # Vitest
114
+ yarn tsc -p tsconfig.web.json --noEmit
115
+ yarn tsc -p tsconfig.node.json --noEmit
116
+ KAI_DATA_PATH=$HOME/.kai_test yarn test:e2e
100
117
  ```
101
118
 
102
119
  ## 架构
103
120
 
121
+ KAi 的代码按职责分层,而不是按运行环境硬塞在一起:
122
+
123
+ ```text
124
+ src/
125
+ ├── core/ # 领域核心:Agent、Message、Tools、Skill、Workspace
126
+ ├── adapters/ # 适配器:LLM、DB、MCP、Storage、Tools、Scheduler、Channel
127
+ ├── electron/ # Electron 主进程、preload、updater、crash、remote
128
+ ├── renderer/ # React 渲染进程
129
+ ├── shared/ # 共享类型、配置、工具函数
130
+ ├── app/ # 应用 bootstrap
131
+ ├── cli/ # CLI 入口
132
+ └── telemetry-server/ # 遥测服务端
133
+ ```
134
+
104
135
  ### Agent 执行层
105
136
 
137
+ ```text
138
+ SoloExecutor # 单 Agent 对话
139
+ SwarmExecutor # 多 Agent 群聊编排:handoff / task / broadcast / supervisor
140
+ ├── TaskOrchestrator # 子任务与广播任务编排
141
+ ├── SwarmContext # 群聊运行态:handoff chain、task map 等
142
+ └── AgentExecutor # 当前生产执行器:流式模型调用、工具循环、fallback、压缩
143
+
144
+ AgentLoop # 正在演进的新执行循环抽象:retry / stopWhen / tool loop / usage collect
145
+ └── AgentKernel # 单次模型调用内核:streamText、工具调用投影、tool-call repair
106
146
  ```
107
- SoloExecutor ← 单 Agent 对话
108
- SwarmExecutor ← 多 Agent 群聊(管理 handoff 循环)
109
- ├── AgentExecutor ← 单次 LLM 调用(流式 + 工具执行循环)
110
- ├── SupervisorLoop ← 监督评估循环
111
- ├── TaskOrchestrator ← 子任务创建和管理
112
- └── SwarmContext ← 共享状态(handoff chain、task map)
147
+
148
+ ### 消息与线程
149
+
150
+ ```text
151
+ User Input
152
+ window.api.sendUserMessage()
153
+ → MessageQueue
154
+ → MessageProcessor
155
+ → SoloChat / GroupChat
156
+ → SoloExecutor / SwarmExecutor
157
+ → LLM + Tools
158
+ → ConversationEvent stream
159
+ → Zustand Store
160
+ → React UI
113
161
  ```
114
162
 
163
+ - 单聊以 Agent 为目标。
164
+ - 群聊以 Thread 为讨论现场,`speaker` 是线程级状态。
165
+ - 消息仍由 SQLite 持久化;长上下文由文件 `context.json` 保存。
166
+
115
167
  ### 消息压缩管线
116
168
 
117
- 长对话自动压缩,4 级策略管道:
169
+ 长对话自动压缩,按成本从低到高处理:
118
170
 
119
- ```
120
- ToolResultSpill(合并冗长工具结果)
121
- → ReasoningRemoval(移除推理过程)
122
- → Summarization(摘要旧消息)
123
- → Pruning(裁剪最旧消息)
171
+ ```text
172
+ ToolResultSpill
173
+ → ReasoningRemoval
174
+ → Summarization
175
+ → Pruning
124
176
  ```
125
177
 
126
178
  ### 数据存储
127
179
 
128
- ```
180
+ ```text
129
181
  ~/.kai/
130
- ├── kai.db # SQLite 主数据库
131
- ├── config/ # 应用配置(加密存储 API Key
182
+ ├── kai.db # SQLite:消息等结构化数据
183
+ ├── config/ # 应用配置,加密存储 API Key
132
184
  ├── agents/
133
185
  │ └── {agentId}/
134
- └── workspace/ # Agent 工作空间
135
- ├── IDENTITY.md # 身份定义
136
- ├── SOUL.md # 行为准则
137
- ├── MEMORY.md # 长期记忆
138
- │ ├── USER.md # 用户信息
139
- │ ├── AGENTS.md # 工作指南
140
- │ ├── TOOLS.md # 环境配置
141
- └── memory/ # 每日笔记
142
- ├── attachments/ # 对话附件
143
- └── sessions/ # 会话消息存储
186
+ ├── meta.json # Agent 身份
187
+ ├── config.json # 模型、fallback、skills、MCP、禁用工具等能力配置
188
+ ├── context.json # 单聊上下文
189
+ └── workspace/
190
+ │ ├── IDENTITY.md
191
+ │ ├── SOUL.md
192
+ │ ├── USER.md
193
+ ├── MEMORY.md
194
+ ├── AGENTS.md
195
+ │ ├── TOOLS.md
196
+ │ └── memory/
197
+ ├── groups/
198
+ │ └── {groupId}/
199
+ │ ├── meta.json
200
+ │ ├── config.json
201
+ │ ├── members.json
202
+ │ ├── GROUP_SETTINGS.md # 人可写,AI 只读
203
+ │ ├── GROUP_MEMORY.md # 群长期记忆
204
+ │ ├── memory/ # 群每日记忆
205
+ │ └── threads/
206
+ │ └── {threadId}/
207
+ │ ├── meta.json
208
+ │ ├── config.json
209
+ │ └── context.json # 线程上下文
210
+ ├── conversations/ # 追加式消息日志(jsonl)
211
+ └── attachments/ # 对话附件
144
212
  ```
145
213
 
146
214
  ## 支持的 LLM
@@ -150,69 +218,42 @@ KAi 通过 Vercel AI SDK 连接大语言模型,支持:
150
218
  - OpenAI Compatible(OpenAI、DeepSeek、Moonshot、MiniMax 等)
151
219
  - Anthropic Claude
152
220
  - Google Gemini
153
- - 任何兼容 OpenAI API 的模型
221
+ - 任何兼容 OpenAI API 的模型服务
154
222
 
155
- 在设置的 LLM 通道中配置 API Key 即可使用。
223
+ 在设置的「模型通道」中配置 API Key 即可使用。
156
224
 
157
225
  ## MCP(Model Context Protocol)
158
226
 
159
- KAi 内置 MCP 客户端支持。在设置中配置 MCP 服务器,即可让 Agent 使用外部工具:
227
+ KAi 内置 MCP 客户端。在设置中添加 MCP 服务,然后应用到指定 Agent;只有被授权的 Agent 才会看到对应 MCP 工具。
228
+
229
+ 示例配置形态:
160
230
 
161
231
  ```json
162
232
  {
163
- "mcp": {
164
- "servers": {
165
- "my-server": {
166
- "command": "npx",
167
- "args": ["-y", "@my/mcp-server"]
168
- }
169
- }
170
- }
233
+ "command": "npx",
234
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
171
235
  }
172
236
  ```
173
237
 
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
238
  ## 安全模型
209
239
 
210
240
  KAi 采用 Electron 三进程安全架构:
211
241
 
212
- - **渲染进程**:完全沙箱化,无 Node.js 访问
213
- - **预加载层**:`contextIsolation: true` + `nodeIntegration: false`
214
- - **主进程**:所有文件系统、网络操作通过 IPC 暴露给渲染进程
215
- - **API Key**:AES-256 加密存储,使用机器唯一标识派生密钥
242
+ - **渲染进程**:沙箱化,无 Node.js 直接访问。
243
+ - **预加载层**:`contextIsolation: true` + `nodeIntegration: false`。
244
+ - **主进程**:文件系统、网络、数据库和工具调用通过 IPC 受控暴露。
245
+ - **文件工具**:要求绝对 `workdir` + 相对 `path`,拒绝路径逃逸。
246
+ - **数据库工具**:只允许只读查询。
247
+ - **API Key**:使用本地 salt + machineId 派生密钥,并通过 AES-256-GCM 加密存储。
248
+
249
+ ## 进一步阅读
250
+
251
+ - [架构文档](docs/architecture/architecture.md)
252
+ - [功能清单](docs/features.md)
253
+ - [发版流程](docs/workflow/发版流程.md)
254
+ - [基于 worktree 的开发流程](docs/workflow/ai-worktree-workflow.md)
255
+ - [Swarm Supervisor 设计](docs/design/swarm-supervisor-design.md)
256
+ - [Agent Kernel / Loop 设计](docs/design/agent-kernel-loop-design.md)
216
257
 
217
258
  ## License
218
259