kiki-agent-lite 0.3.1 → 0.3.2

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 (228) hide show
  1. package/README.md +13 -10
  2. package/dist/docs/en/configuration/config-files.md +63 -20
  3. package/dist/docs/en/configuration/data-locations.md +12 -4
  4. package/dist/docs/en/configuration/env-vars.md +4 -6
  5. package/dist/docs/en/configuration/overrides.md +13 -14
  6. package/dist/docs/en/configuration/providers.md +8 -6
  7. package/dist/docs/en/customization/agent-profiles.md +33 -38
  8. package/dist/docs/en/customization/agents.md +129 -107
  9. package/dist/docs/en/customization/hooks.md +41 -48
  10. package/dist/docs/en/customization/personas.md +19 -21
  11. package/dist/docs/en/customization/plugins.md +180 -156
  12. package/dist/docs/en/customization/prompt-fields.md +10 -6
  13. package/dist/docs/en/customization/skills.md +11 -13
  14. package/dist/docs/en/customization/skins.md +23 -27
  15. package/dist/docs/en/customization/themes.md +15 -15
  16. package/dist/docs/en/features/agents.md +85 -0
  17. package/dist/docs/en/features/daily.md +37 -7
  18. package/dist/docs/en/features/ecosystem.md +3 -1
  19. package/dist/docs/en/features/extend.md +7 -1
  20. package/dist/docs/en/features/freedom.md +4 -0
  21. package/dist/docs/en/features/index.md +6 -5
  22. package/dist/docs/en/features/long-work.md +23 -5
  23. package/dist/docs/en/features/look.md +1 -1
  24. package/dist/docs/en/features/people.md +10 -2
  25. package/dist/docs/en/features/spaces.md +16 -4
  26. package/dist/docs/en/features/workbench.md +11 -3
  27. package/dist/docs/en/getting-started/desktop-app.md +44 -29
  28. package/dist/docs/en/getting-started/first-launch.md +32 -21
  29. package/dist/docs/en/getting-started/installation.md +27 -12
  30. package/dist/docs/en/getting-started/use-cases.md +35 -35
  31. package/dist/docs/en/guides/goals.md +9 -7
  32. package/dist/docs/en/guides/interaction.md +26 -26
  33. package/dist/docs/en/guides/interface.md +18 -14
  34. package/dist/docs/en/guides/memory.md +43 -14
  35. package/dist/docs/en/guides/sessions.md +32 -26
  36. package/dist/docs/en/guides/settings.md +60 -29
  37. package/dist/docs/en/index.md +8 -2
  38. package/dist/docs/en/reference/command.md +8 -4
  39. package/dist/docs/en/reference/keyboard.md +18 -4
  40. package/dist/docs/en/reference/model-vocabulary.md +6 -8
  41. package/dist/docs/en/reference/slash-commands.md +4 -4
  42. package/dist/docs/en/reference/tools.md +92 -15
  43. package/dist/docs/en/release-notes/changelog.md +1 -9
  44. package/dist/docs/en/server/acp.md +1 -1
  45. package/dist/docs/en/server/ide.md +1 -1
  46. package/dist/docs/en/server/local-server.md +5 -5
  47. package/dist/docs/en/server/mcp.md +2 -2
  48. package/dist/docs/en/server/rest-api.md +79 -5
  49. package/dist/docs/en/server/sdk.md +2 -2
  50. package/dist/docs/zh/configuration/config-files.md +56 -15
  51. package/dist/docs/zh/configuration/data-locations.md +12 -4
  52. package/dist/docs/zh/configuration/env-vars.md +4 -6
  53. package/dist/docs/zh/configuration/overrides.md +13 -14
  54. package/dist/docs/zh/configuration/providers.md +7 -5
  55. package/dist/docs/zh/customization/agent-profiles.md +31 -36
  56. package/dist/docs/zh/customization/agents.md +120 -98
  57. package/dist/docs/zh/customization/hooks.md +35 -42
  58. package/dist/docs/zh/customization/personas.md +16 -18
  59. package/dist/docs/zh/customization/plugins.md +167 -142
  60. package/dist/docs/zh/customization/prompt-fields.md +9 -5
  61. package/dist/docs/zh/customization/skills.md +10 -12
  62. package/dist/docs/zh/customization/skins.md +19 -23
  63. package/dist/docs/zh/customization/themes.md +12 -12
  64. package/dist/docs/zh/features/agents.md +85 -0
  65. package/dist/docs/zh/features/daily.md +37 -7
  66. package/dist/docs/zh/features/ecosystem.md +3 -1
  67. package/dist/docs/zh/features/extend.md +7 -1
  68. package/dist/docs/zh/features/freedom.md +4 -0
  69. package/dist/docs/zh/features/index.md +6 -5
  70. package/dist/docs/zh/features/long-work.md +22 -4
  71. package/dist/docs/zh/features/look.md +1 -1
  72. package/dist/docs/zh/features/people.md +10 -2
  73. package/dist/docs/zh/features/spaces.md +15 -3
  74. package/dist/docs/zh/features/workbench.md +11 -3
  75. package/dist/docs/zh/getting-started/desktop-app.md +43 -28
  76. package/dist/docs/zh/getting-started/first-launch.md +32 -21
  77. package/dist/docs/zh/getting-started/installation.md +26 -11
  78. package/dist/docs/zh/getting-started/use-cases.md +35 -37
  79. package/dist/docs/zh/guides/goals.md +8 -8
  80. package/dist/docs/zh/guides/interaction.md +25 -25
  81. package/dist/docs/zh/guides/interface.md +18 -14
  82. package/dist/docs/zh/guides/memory.md +43 -14
  83. package/dist/docs/zh/guides/sessions.md +30 -24
  84. package/dist/docs/zh/guides/settings.md +54 -23
  85. package/dist/docs/zh/index.md +7 -1
  86. package/dist/docs/zh/reference/command.md +7 -3
  87. package/dist/docs/zh/reference/keyboard.md +18 -4
  88. package/dist/docs/zh/reference/model-vocabulary.md +6 -8
  89. package/dist/docs/zh/reference/slash-commands.md +3 -3
  90. package/dist/docs/zh/reference/tools.md +74 -9
  91. package/dist/docs/zh/release-notes/changelog.md +1 -9
  92. package/dist/docs/zh/server/acp.md +1 -1
  93. package/dist/docs/zh/server/ide.md +1 -1
  94. package/dist/docs/zh/server/local-server.md +5 -5
  95. package/dist/docs/zh/server/mcp.md +2 -2
  96. package/dist/docs/zh/server/rest-api.md +69 -1
  97. package/dist/docs/zh/server/sdk.md +2 -2
  98. package/dist/main.mjs +12545 -3456
  99. package/dist/web/assets/AppErrorBoundary-RFIAb-Uf.js +1 -0
  100. package/dist/web/assets/NavScopeBoundary-DY_ET7A-.js +1 -0
  101. package/dist/web/assets/{arc-y2SkSoyr.js → arc-CMgTB1m7.js} +1 -1
  102. package/dist/web/assets/{architectureDiagram-3BPJPVTR-uCwLz53m.js → architectureDiagram-3BPJPVTR-BU79ou2C.js} +1 -1
  103. package/dist/web/assets/{blockDiagram-GPEHLZMM-BZyWv36G.js → blockDiagram-GPEHLZMM-Bkuldod2.js} +1 -1
  104. package/dist/web/assets/{c4Diagram-AAUBKEIU-DKGx9i50.js → c4Diagram-AAUBKEIU-C3WMeqyu.js} +1 -1
  105. package/dist/web/assets/channel-DpDZUJRn.js +1 -0
  106. package/dist/web/assets/{chunk-2J33WTMH-CSkrhrsp.js → chunk-2J33WTMH-CesyWmwo.js} +1 -1
  107. package/dist/web/assets/{chunk-4BX2VUAB-CtxMoJ68.js → chunk-4BX2VUAB-C7rghYTf.js} +1 -1
  108. package/dist/web/assets/{chunk-55IACEB6-Dos3ftEy.js → chunk-55IACEB6-BqRHhwtz.js} +1 -1
  109. package/dist/web/assets/{chunk-727SXJPM-wbzEYK9z.js → chunk-727SXJPM-BhSqCRBc.js} +1 -1
  110. package/dist/web/assets/{chunk-AQP2D5EJ-B9GKvCD6.js → chunk-AQP2D5EJ-DdYE2ZVZ.js} +1 -1
  111. package/dist/web/assets/{chunk-FMBD7UC4-u5Y2P6IX.js → chunk-FMBD7UC4-BCRPUxDF.js} +1 -1
  112. package/dist/web/assets/{chunk-ND2GUHAM-B8rFKkTV.js → chunk-ND2GUHAM-CuvyDjTR.js} +1 -1
  113. package/dist/web/assets/{chunk-QZHKN3VN-EQsKtuD-.js → chunk-QZHKN3VN-BU5vAS78.js} +1 -1
  114. package/dist/web/assets/classDiagram-4FO5ZUOK-Bju1GfNu.js +1 -0
  115. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-Bju1GfNu.js +1 -0
  116. package/dist/web/assets/client-C0oH7-8r.js +2 -0
  117. package/dist/web/assets/connection-BhO2nh7P.js +1 -0
  118. package/dist/web/assets/{cose-bilkent-S5V4N54A-D6dr5mIW.js → cose-bilkent-S5V4N54A-CXrvsA1a.js} +1 -1
  119. package/dist/web/assets/{dagre-BM42HDAG-Dnyhc4Hn.js → dagre-BM42HDAG-TaAea3Rt.js} +1 -1
  120. package/dist/web/assets/{diagram-2AECGRRQ-CYXkWdne.js → diagram-2AECGRRQ-CdEH4jGt.js} +1 -1
  121. package/dist/web/assets/{diagram-5GNKFQAL-DPwBf5Ag.js → diagram-5GNKFQAL-A0jZ_p-T.js} +1 -1
  122. package/dist/web/assets/{diagram-KO2AKTUF-DNeLYZ8X.js → diagram-KO2AKTUF-miHWORz3.js} +1 -1
  123. package/dist/web/assets/{diagram-LMA3HP47-zU8RsQTX.js → diagram-LMA3HP47-BlUIwEIg.js} +1 -1
  124. package/dist/web/assets/{diagram-OG6HWLK6-Cf9Mm94H.js → diagram-OG6HWLK6-DwDzMhEg.js} +1 -1
  125. package/dist/web/assets/{erDiagram-TEJ5UH35-Ch4CeiUI.js → erDiagram-TEJ5UH35-BJr5w62i.js} +1 -1
  126. package/dist/web/assets/export-BlxaZKEe.js +2 -0
  127. package/dist/web/assets/{flowDiagram-I6XJVG4X-Csn6WqEH.js → flowDiagram-I6XJVG4X-BP7KSFjx.js} +1 -1
  128. package/dist/web/assets/{ganttDiagram-6RSMTGT7-DsuBgEyu.js → ganttDiagram-6RSMTGT7-BstLBBof.js} +1 -1
  129. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-CPA7jCxU.js → gitGraphDiagram-PVQCEYII-C57s7nZ-.js} +1 -1
  130. package/dist/web/assets/highlighted-body-OFNGDK62-BVb-7KsA.js +1 -0
  131. package/dist/web/assets/index-69qhvTvD.js +1 -0
  132. package/dist/web/assets/{index-BYUHmd8w.js → index-BDNM6yJI.js} +2 -2
  133. package/dist/web/assets/{index-BGgZxlEQ.js → index-BJF_gEDs.js} +2 -2
  134. package/dist/web/assets/index-BOwMP6BP.js +1 -0
  135. package/dist/web/assets/{index-C69a5Mcz.js → index-BZsyXCqm.js} +1 -1
  136. package/dist/web/assets/{index-C7EA7a_g.js → index-Bfl4JiNq.js} +2 -2
  137. package/dist/web/assets/index-BlD3AKX-.js +1 -0
  138. package/dist/web/assets/{index-CIymCfcP.js → index-BnvW0EvQ.js} +1 -1
  139. package/dist/web/assets/index-C4rmWyOm.js +1 -0
  140. package/dist/web/assets/index-CGLcb3HY.js +1 -0
  141. package/dist/web/assets/{index-kWBxPqIX.js → index-CPvOeQPX.js} +1 -1
  142. package/dist/web/assets/index-Cjbe0JKM.js +1 -0
  143. package/dist/web/assets/index-CmYoJWUm.js +1 -0
  144. package/dist/web/assets/index-CtUFrjKe.js +1 -0
  145. package/dist/web/assets/index-DDvDRMTK.js +1 -0
  146. package/dist/web/assets/index-DSpndwAR.css +1 -0
  147. package/dist/web/assets/index-D_JjTHxi.js +1 -0
  148. package/dist/web/assets/index-DbuwcnbT.js +1 -0
  149. package/dist/web/assets/index-DcXyS0nN.js +1 -0
  150. package/dist/web/assets/index-Dcl9ruKA.js +1 -0
  151. package/dist/web/assets/index-DgwALPNA.js +121 -0
  152. package/dist/web/assets/{index-DoN1FTEe.js → index-DkE8hRT1.js} +2 -2
  153. package/dist/web/assets/index-DsyRBZ4h.js +1 -0
  154. package/dist/web/assets/{index-29zav3JI.js → index-DuudNhLL.js} +4 -4
  155. package/dist/web/assets/index-Gc4F0b2f.js +1 -0
  156. package/dist/web/assets/index-HGqqwKoV.js +13 -0
  157. package/dist/web/assets/index-KchrJnno.js +3 -0
  158. package/dist/web/assets/{index-B0KNSyji.js → index-Tmi2BPYU.js} +1 -1
  159. package/dist/web/assets/index-Ya4GuDs0.js +1 -0
  160. package/dist/web/assets/index-_aDaKqLB.js +1 -0
  161. package/dist/web/assets/index-_qwOAotB.js +1 -0
  162. package/dist/web/assets/index-hnIkczza.js +7 -0
  163. package/dist/web/assets/{infoDiagram-5YYISTIA-D3Q__m62.js → infoDiagram-5YYISTIA-CifuVY6C.js} +1 -1
  164. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-CcvCBuZ5.js → ishikawaDiagram-YF4QCWOH-Cd60vQUi.js} +1 -1
  165. package/dist/web/assets/{journeyDiagram-JHISSGLW-COZU4LNt.js → journeyDiagram-JHISSGLW-Cb3Xl_wl.js} +1 -1
  166. package/dist/web/assets/{kanban-definition-UN3LZRKU-BrXjBoAU.js → kanban-definition-UN3LZRKU-Ei6ThuZt.js} +1 -1
  167. package/dist/web/assets/{linear-BgP1STFi.js → linear-CDZJx-o2.js} +1 -1
  168. package/dist/web/assets/mermaid-GHXKKRXX-DFxyxD7G.js +331 -0
  169. package/dist/web/assets/{mindmap-definition-RKZ34NQL-CgjSrE5r.js → mindmap-definition-RKZ34NQL-B0ygxzkx.js} +1 -1
  170. package/dist/web/assets/navViewState-Ck_HK-TK.js +1 -0
  171. package/dist/web/assets/{pieDiagram-4H26LBE5-DTfe1sKA.js → pieDiagram-4H26LBE5-B2FdrvDv.js} +1 -1
  172. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-D95hfh0q.js → quadrantDiagram-W4KKPZXB-CwpOTy3d.js} +1 -1
  173. package/dist/web/assets/{requirementDiagram-4Y6WPE33-DtSLi7Mh.js → requirementDiagram-4Y6WPE33-ExdZNzLQ.js} +1 -1
  174. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-gi_dJpcU.js → sankeyDiagram-5OEKKPKP-u0EZKD7D.js} +1 -1
  175. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DKQ9a72t.js → sequenceDiagram-3UESZ5HK-BXHMy5DY.js} +1 -1
  176. package/dist/web/assets/{spaces-B2Ccyh_T.js → spaces-C8n7xQPx.js} +1 -1
  177. package/dist/web/assets/{stateDiagram-AJRCARHV-Bz7tmSqa.js → stateDiagram-AJRCARHV-DMXx7ell.js} +1 -1
  178. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Bydq1_By.js +1 -0
  179. package/dist/web/assets/theme-BBnHttAf.js +1 -0
  180. package/dist/web/assets/{timeline-definition-PNZ67QCA-BfMXPwhV.js → timeline-definition-PNZ67QCA-DtqVG_4u.js} +1 -1
  181. package/dist/web/assets/{vennDiagram-CIIHVFJN-WLxW2KT5.js → vennDiagram-CIIHVFJN-Dom0ex8r.js} +1 -1
  182. package/dist/web/assets/{wardley-L42UT6IY-DiiqwIdq.js → wardley-L42UT6IY-C-RstmuQ.js} +1 -1
  183. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DmCukWuw.js → wardleyDiagram-YWT4CUSO-C8CzNfdf.js} +1 -1
  184. package/dist/web/assets/{xychartDiagram-2RQKCTM6-Cfq1W2tT.js → xychartDiagram-2RQKCTM6-1AxVTyB6.js} +1 -1
  185. package/dist/web/index.html +2 -2
  186. package/native/auth-native/prebuilds/linux-arm64/auth-native.node +0 -0
  187. package/native/auth-native/prebuilds/linux-x64/auth-native.node +0 -0
  188. package/native/auth-native/prebuilds/win32-arm64/auth-native.node +0 -0
  189. package/native/auth-native/prebuilds/win32-x64/auth-native.node +0 -0
  190. package/package.json +1 -1
  191. package/dist/web/assets/AppErrorBoundary-DWpgwxFV.js +0 -1
  192. package/dist/web/assets/NavScopeBoundary-D8Lf1G0U.js +0 -1
  193. package/dist/web/assets/channel-BGdXootG.js +0 -1
  194. package/dist/web/assets/classDiagram-4FO5ZUOK-CPcnLy_H.js +0 -1
  195. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CPcnLy_H.js +0 -1
  196. package/dist/web/assets/client-DSIbyfoz.js +0 -2
  197. package/dist/web/assets/connection-DYZn9oPZ.js +0 -1
  198. package/dist/web/assets/export-Bq8ZECqX.js +0 -2
  199. package/dist/web/assets/highlighted-body-OFNGDK62-CDPBxM_E.js +0 -1
  200. package/dist/web/assets/index-AksnytJj.js +0 -1
  201. package/dist/web/assets/index-B8xhhYDh.css +0 -1
  202. package/dist/web/assets/index-BUrlrKap.js +0 -1
  203. package/dist/web/assets/index-B_5-HLed.js +0 -62
  204. package/dist/web/assets/index-BfmoxdpP.js +0 -1
  205. package/dist/web/assets/index-Bo3e-ohM.js +0 -3
  206. package/dist/web/assets/index-BrYV9gV_.js +0 -1
  207. package/dist/web/assets/index-C8XUtAvK.js +0 -1
  208. package/dist/web/assets/index-C9uil5my.js +0 -13
  209. package/dist/web/assets/index-CKpWHSp9.js +0 -1
  210. package/dist/web/assets/index-CLKBgQxV.js +0 -1
  211. package/dist/web/assets/index-CTyyUNWj.js +0 -7
  212. package/dist/web/assets/index-D7cg9qYZ.js +0 -1
  213. package/dist/web/assets/index-D7dg8R_q.js +0 -1
  214. package/dist/web/assets/index-DCSpedV_.js +0 -1
  215. package/dist/web/assets/index-DLbD0Nx5.js +0 -1
  216. package/dist/web/assets/index-DaEzbvvu.js +0 -1
  217. package/dist/web/assets/index-DhbcjMZF.js +0 -1
  218. package/dist/web/assets/index-Dw2h88mF.js +0 -1
  219. package/dist/web/assets/index-FcMtfmKv.js +0 -1
  220. package/dist/web/assets/index-XFq9Kgg0.js +0 -1
  221. package/dist/web/assets/index-iI2mM43w.js +0 -1
  222. package/dist/web/assets/index-oXOF7lko.js +0 -1
  223. package/dist/web/assets/locale-CANfezJ4.js +0 -17
  224. package/dist/web/assets/mermaid-GHXKKRXX-_JLagMll.js +0 -321
  225. package/dist/web/assets/navViewState-DS5LnMYc.js +0 -1
  226. package/dist/web/assets/settings-CcwMWXbp.js +0 -42
  227. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-D6-wdUbw.js +0 -1
  228. package/dist/web/assets/theme-DlDhDxeD.js +0 -1
@@ -1,13 +1,13 @@
1
1
  # Plugins
2
2
 
3
- Plugins package reusable Kiki capabilities into installable units — they can add [Agent Skills](./skills.md), custom [agents](./agents.md), automatically load a specified Skill at session start, contribute system-prompt instructions, declare MCP servers to provide real tool capabilities, and bring another tool's conversation history in as a [Kiki session you can keep working in](#session-history-import), or as a read-only archive. They are ideal for sharing workflows with a team, connecting to external services, or installing extensions from the [official plugins](#official-plugins).
3
+ A plugin packages reusable Kiki capabilities into one installable unit. A plugin can add [Agent Skills](./skills.md), custom [agents](./agents.md), a Skill loaded automatically at session start, system-prompt instructions, MCP servers that provide real tool capabilities, and another tool's conversation history — as a [Kiki session you can keep working in](#session-history-import) or as a read-only archive. That makes plugins the way to share a workflow with a team, connect to an external service, or install from the [official list](#official-plugins).
4
4
 
5
- ## Installation and Management
5
+ ## Install and manage
6
6
 
7
- Run `/plugins` in the TUI to open the plugin manager. It is a single panel with four tabs, switched with `Tab` / `Shift-Tab`:
7
+ `/plugins` opens the plugin manager in the TUI: one panel with four tabs, switched with `Tab` / `Shift-Tab`:
8
8
 
9
9
  - **Installed**: Manage installed plugins
10
- - **Official**: Kimi-maintained marketplace plugins
10
+ - **Official**: Marketplace plugins Kiki and Kimi maintain
11
11
  - **Curated**: Third-party plugins from Kimi partners in the default marketplace
12
12
  - **Custom**: Install from a URL
13
13
 
@@ -53,37 +53,36 @@ Network requests only go through `github.com` redirects and `codeload.github.com
53
53
 
54
54
  ### Installing a plugin that runs code
55
55
 
56
- Most of a plugin is declarative: Skills, agents, prompt text, themes, MCP server declarations. A plugin that needs more ships an entry file, and Kiki runs that file as Node.js code with your account's permissions — that is how a plugin reads a folder you point it at or imports a history file. It is not a sandbox: the code has the same access you do.
56
+ Most of a plugin is declarative: Skills, agents, prompt text, themes, MCP server declarations. A plugin that needs more ships an entry file, and Kiki runs that file as Node.js code with your account's permissions — that is how a plugin reads a folder you point it at or imports a history file. That code is not sandboxed; it has the same access you do.
57
57
 
58
- Kiki therefore asks for consent once per source before installing such a plugin. `/plugins install <source>` reports that the plugin runs trusted code and stops; add `--trust` to give the consent:
58
+ Kiki therefore asks once per source before installing such a plugin. `/plugins install <source>` reports that it runs trusted code and stops; add `--trust` to consent:
59
59
 
60
60
  ```sh
61
61
  /plugins install --trust ./my-plugin
62
62
  ```
63
63
 
64
- In the GUI, the install sheet lists what the plugin would add and what it will be able to do, and its button reads **Allow and install** instead of **Install** while this consent is needed.
64
+ In the GUI the install sheet lists what the plugin would add and be able to do, and its button reads **Allow and install** while this consent is needed.
65
65
 
66
- The consent is remembered for the source, not for each file, page, or call:
66
+ The consent is remembered per source, not per file, page or call. Reinstalling or updating from the same source does not ask again, even if its contributions, description or declared permissions changed since you approved; a different source that reuses the same plugin id asks again; and for a GitHub URL the source is `owner/repo`, so switching branch, tag or commit inside that repository does not ask. The one change that does ask is a plugin that starts shipping an entry file it did not have.
67
67
 
68
- - Installing or updating from the same source again does not ask — even when the plugin's contributions, description, or declared permissions have changed since you approved it.
69
- - A different source that reuses the same plugin id is a new source and asks again.
70
- - For a GitHub URL, the source is the `owner/repo`, so switching branches, tags, or commits inside that repository does not ask again.
71
- - One change does ask again: a plugin that had no entry file starts shipping one.
68
+ You are approving the source, not the exact bytes: Kiki fingerprints the plugin folder at the preview and refuses an install whose files changed afterwards. That protects the preview, not later actions — the tool calls a trusted plugin makes still follow your current permission mode and tool rules.
72
69
 
73
- What you approve is the source rather than the exact bytes: Kiki fingerprints the plugin folder at the preview and refuses an install whose files changed after it. That fingerprint protects the preview, not each later action — once a source is trusted, reinstalling or updating it does not ask again, while the tool calls it produces still follow your current permission mode and tool rules.
70
+ ### Things worth knowing
74
71
 
75
- ### Notes
76
-
77
- - Local plugin updates take effect in the conversation you are already in. Install a local plugin once with `/plugins install --trust <path>` and enable it with `/plugins enable <id>`; a newly installed plugin starts disabled. After editing your source directory, run `/plugins install <path>` again with the same path — the updated code and manifest replace the managed copy, the plugin stays enabled, and the tool is available to the same conversation once that command returns. No `/plugins reload`, `/reload`, or `/new` is needed. The already-consented source does not ask for `--trust` again.
78
- - An update waits for that plugin's in-flight work before switching: calls already running finish on the old version, and calls that arrive during the switch wait and run on the new one. Other plugins are not restarted and keep running. A call already resolved against an older tool definition asks for a retry instead of running against changed rules.
79
- - `/plugins reload` is the separate explicit global action. It re-reads `installed.json` and the managed copies of every plugin and never copies from your source directories, so it is not the way to pick up a source edit. System-prompt sections and plugin Skills still rebuild through their own documented timing — see [System-prompt instructions](#system-prompt-instructions) and [Plugin agents](#plugin-agents).
80
- - Local installations are copied to `$KIKI_HOME/plugins/managed/<id>/`, and the CLI always runs from this managed copy. Edit the source directory and reinstall; editing the managed copy by hand does not give the same update path and a later reinstall overwrites it.
81
- - Removing a plugin only deletes the installation record; the managed copy and original source files remain on disk.
82
- - Plugins are currently installed per-user and apply to all projects; project-level installation scope is not yet supported.
72
+ - **Local edits take effect in the conversation you are already in.** Install once with `/plugins install --trust <path>`, enable with `/plugins enable <id>` (a new plugin starts disabled), then after editing your source run `/plugins install <path>` again with the same path: the managed copy is replaced, the plugin stays enabled, and the tool is available to that conversation as soon as the command returns. No `/plugins reload`, `/reload` or `/new` is needed, and the consented source does not ask for `--trust` again.
73
+ - **An update waits for that plugin's in-flight work.** Running calls finish on the old version and calls arriving during the switch wait and run on the new one. Other plugins keep running untouched, and a call already resolved against an older tool definition asks for a retry instead of running against changed rules.
74
+ - **`/plugins reload` is the global re-read**, of `installed.json` and every managed copy. It never copies from your source directories, so it is not how you pick up a source edit; system-prompt sections and plugin Skills rebuild on their own documented timing (see [System-prompt instructions](#system-prompt-instructions) and [Plugin agents](#plugin-agents)).
75
+ - **Local installs are copied** to `$KIKI_HOME/plugins/managed/<id>/`, and the CLI always runs from that copy. Edit the source and reinstall — editing the managed copy by hand has no update path and a later reinstall overwrites it.
76
+ - **Removing a plugin deletes only the installation record.** The managed copy and your source files stay on disk.
77
+ - **Plugins are installed per user** and apply to every project.
83
78
 
84
79
  ### Custom marketplace JSON
85
80
 
86
- Pass a marketplace JSON path or URL to `/plugins marketplace <source>`, set [`KIKI_PLUGIN_MARKETPLACE_URL`](../configuration/env-vars.md), or configure `[plugins] marketplace_url` in `config.toml`. The order is command source, environment variable, then config; without any source, Kiki does not fetch a remote catalog and still shows built-in capabilities. Each entry in the `plugins` array needs an `id` and a `source` (local path, zip URL, or GitHub URL):
81
+ Pass a marketplace JSON path or URL to `/plugins marketplace <source>`, set [`KIKI_PLUGIN_MARKETPLACE_URL`](../configuration/env-vars.md), or configure `[plugins] marketplace_url` in `config.toml`; the command wins over the environment variable, which wins over the config. With no custom source, Kiki uses the official [Kiki Plugins catalog](https://x-t-e-r.github.io/kiki-plugins/marketplace.json). If the catalog cannot be reached, the bundled metadata still lets you browse it; installing a package still needs access to its download URL.
82
+
83
+ Kiki's own plugins — writing, document extraction, media sources, Notion and the rest — are built in a separate [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins), not in the Kiki source tree. That is where their source lives, where you send a change, and what a development checkout points at. Installing from the official catalog is the ordinary route: Kiki downloads the published package and checks it against the SHA256 digest recorded in the catalog, so what runs is the artifact that was released, not whatever a directory happens to contain. A checkout of that repository is only for working on the plugins themselves.
84
+
85
+ Each entry in the `plugins` array needs an `id` and a `source` (local path, zip URL or GitHub URL):
87
86
 
88
87
  ```json
89
88
  {
@@ -100,7 +99,7 @@ Pass a marketplace JSON path or URL to `/plugins marketplace <source>`, set [`KI
100
99
 
101
100
  ## Local document extraction
102
101
 
103
- `kiki-documents` converts a local PDF, Office, HTML or text file into Markdown that `Read` and `Grep` can use. Install and enable the plugin through the existing plugin manager, then ask Kiki to extract a file into a new folder and read the result. The package bundles the official `@nb-corp/nb-extract` 0.1.1 JavaScript API and dependencies; it needs no runtime npm install or local skill checkout.
102
+ **Kiki Extract** (`kiki-extract`, formerly `kiki-documents`) converts a local PDF, Office, HTML or text file into Markdown that `Read` and `Grep` can use. Install and enable it from the plugin manager, then ask Kiki to extract a file into a new folder and read the result. Everything it needs is bundled — no runtime npm install, no skill checkout. Installing the renamed package replaces an existing `kiki-documents` install rather than sitting beside it, so your existing settings carry over.
104
103
 
105
104
  HTML (`.html`/`.htm`), Markdown and plain text work immediately. Local PDF, DOCX, XLSX/XLS and PPTX need Python 3.10+ with MarkItDown's matching format dependencies on the machine running Kiki. Prepare a virtual environment once:
106
105
 
@@ -114,21 +113,21 @@ On Windows, install the formats you need with:
114
113
  .venv-documents/Scripts/python.exe -m pip install "markitdown[pdf,docx,xlsx,xls,pptx]"
115
114
  ```
116
115
 
117
- On macOS/Linux, use `.venv-documents/bin/python` instead. For PDF only, use `markitdown[pdf]`. Set the environment's absolute Python executable path in **Capabilities → Plugins → Kiki Documents → Settings → Python with MarkItDown** (`pythonPath`). The plugin does not install Python or pip dependencies automatically.
116
+ On macOS/Linux, use `.venv-documents/bin/python` instead. For PDF only, use `markitdown[pdf]`. Point the plugin at that interpreter in **Capabilities → Plugins → Kiki Extract → Settings → Python with MarkItDown** (`pythonPath`); it installs neither Python nor the pip dependencies for you.
118
117
 
119
- Each extraction creates a new output directory containing `document.md`, `extraction.json` with source, engine and warnings, and any assets actually returned by the engine. The source is unchanged and existing outputs are not overwritten. The response preview may be shortened and marks `previewTruncated`; use `Read`/`Grep` on the saved Markdown for the full text. MarkItDown does not export images, and Defuddle does not download linked images.
118
+ Each extraction writes a new output directory with `document.md`, an `extraction.json` recording source, engine and warnings, and whatever assets the engine actually returned. The source is untouched and existing output is never overwritten. The response preview may be shortened and marked `previewTruncated` — read the saved Markdown for the full text. MarkItDown does not export images, and Defuddle does not download linked ones.
120
119
 
121
- Auto processing stays local and never uploads or performs OCR. Empty or image-only scans fail rather than being reported as read; partly scanned documents can still omit image-only pages. For cloud OCR, explicitly authorize uploading the file to MinerU, configure its token in plugin settings and select `engine=mineru` with `allowUpload=true`. Service terms and charges apply; stopping local waiting does not cancel the remote task. Missing dependencies, unsupported formats and byte-limit failures return errors, not a complete extraction. Input is limited to 50 MiB with a 600-second deadline.
120
+ Auto processing stays local: nothing is uploaded and no OCR runs. An empty or image-only scan fails rather than being reported as readable, and a partly scanned document can still omit its image-only pages. For cloud OCR, authorize uploading the file to MinerU, set its token in the plugin settings, and select `engine=mineru` with `allowUpload=true`; the service's terms and charges apply, and stopping local waiting does not cancel the remote task. A missing dependency, an unsupported format or a file over the limit returns an error rather than a partial extraction. Input is capped at 50 MiB with a 600-second deadline.
122
121
 
123
122
  ## Media Sources
124
123
 
125
- A media plugin contributes one or more *sources* — a named provider for images, video, or speech. Once a media plugin is installed, its sources appear under **Capabilities → Plugins → Media sources**, one searchable list rather than a page per vendor.
124
+ A media plugin contributes one or more *sources* — a named provider for images, video or speech. Once installed, its sources appear together under **Capabilities → Plugins → Media sources** as one searchable list.
126
125
 
127
126
  ### Turning generation on
128
127
 
129
- Generating is experimental and is **off by default**. Everything else on this page — installing sources, filling in their settings, choosing defaults, and reading past generations — works whether or not it is on. Only starting a new generation needs it.
128
+ Starting a new generation is experimental and **off by default**. Everything else here — installing sources, filling in settings, choosing defaults, reading past generations — works either way.
130
129
 
131
- Three ways to turn it on, in the order Kiki reads them:
130
+ Three ways to enable it, in the order Kiki reads them:
132
131
 
133
132
  - Set `KIKI_EXPERIMENTAL_MEDIA_GENERATION=1` in the environment.
134
133
  - Put `media_generation = true` under `[experimental]` in `config.toml`.
@@ -136,70 +135,97 @@ Three ways to turn it on, in the order Kiki reads them:
136
135
 
137
136
  ### The list
138
137
 
139
- Every source is a single row that answers three things at once: which provider it is, which package it came from, and whether it can be used right now. The status on the right of a row is one of:
138
+ Each row says which provider it is, which package it came from, and whether it can be used now. The status on the right is one of:
140
139
 
141
- - **Ready** — installed, enabled, and the host confirms its configuration.
142
- - **Needs setup** — the host reports a required setting is missing. Open the row to fill it in.
143
- - **Not checked** — the source is installed and enabled, but its configuration has not been read. Kiki does not read every source's settings to draw a list, so a row in this state is neither an assurance nor a warning. Open the row to see its settings.
144
- - **Unavailable** — the package did not load, or you switched it off. Nothing configured in this row will generate until that is fixed.
140
+ - **Ready** — installed, enabled, and its configuration checks out.
141
+ - **Needs setup** — a required setting is missing. Open the row to fill it in.
142
+ - **Not checked** — installed and enabled, but its settings have not been read. Kiki does not read every source just to draw the list, so this is neither a green light nor a warning; open the row to see its settings.
143
+ - **Unavailable** — the package did not load, or you switched it off. Nothing in this row generates until that is fixed.
145
144
  - **Blocked** — a job for this provider could not proceed because the package is not loaded. The job is kept, not discarded.
146
145
 
147
- Filter by modality (image, video, speech) or by status, or type to search. The counts beside each band are the whole list, not the filtered one, so a filter never hides how much is behind it.
146
+ Filter by modality (image, video, speech) or status, or type to search. The count beside each band is the whole list, not the filtered one, so a filter never hides how much sits behind it.
148
147
 
149
148
  ### Configuring a source
150
149
 
151
- Open a row to reach its settings form. The form is the package's own settings — the same fields, the same secret handling and the same save path as the plugin's own detail page, so a provider's key is a plugin's key.
150
+ Open a row for its settings form, which is the package's own settings page: same fields, same secret handling, same save path. A provider's key is a plugin's key.
152
151
 
153
152
  Secrets are write-only. Kiki shows whether a key is stored and never shows the value again; replacing or clearing one is an ordinary edit.
154
153
 
155
- A source can be configured in one of three ways, and the form says which applies rather than making you infer it:
154
+ A source is configured one of three ways, and the form says which applies:
156
155
 
157
- - **Its own settings.** You supply an API key and, if the provider needs one, a base URL. These fields are required only while no connection is selected.
158
- - **An existing Kiki connection.** If the package declares a connection setting, the form offers the connections you already have. Selecting one is enough — the package's own key and endpoint stop being required, and are not used at all. A connection you select must resolve; Kiki does not silently fall back to a previously stored key if it cannot.
159
- - **Self-managed.** A script may manage its own credentials from its own settings, environment variables, or an external file. That is a supported arrangement, and Kiki does not treat the absence of a key as a broken provider. Nothing Kiki stores is displayed back to you in logs, previews, or reports.
156
+ - **Its own settings.** You supply an API key and, if the provider needs one, a base URL. These are required only while no connection is selected.
157
+ - **An existing Kiki connection.** If the package declares a connection setting, the form offers the connections you already have. Selecting one is enough — the package's own key and endpoint are then neither required nor used. The connection you select has to resolve; Kiki does not fall back to a previously stored key if it cannot.
158
+ - **Self-managed.** A script manages its own credentials through its settings, environment variables or an external file. That is a supported arrangement, and the absence of a key is not a broken provider. Nothing Kiki stores is shown back to you in logs, previews or reports.
160
159
 
161
- A connection you already have does not promise that the account behind it can do media work. Kiki surfaces what the provider reports; it does not maintain an allowlist of which connections support which modality.
160
+ An existing connection does not promise that the account behind it can do media work. Kiki shows what the provider reports and keeps no allowlist of which connections support which modality.
162
161
 
163
162
  ### Per-modality defaults
164
163
 
165
- Three settings on the media entry package pick the default source for images, video and speech. They are ordinary plugin settings, stored with the rest of that package's configuration. When a source is the default, the list says so on its row.
164
+ Three settings on the media entry package pick the default source for images, video and speech. They are ordinary plugin settings stored with the rest of that package's configuration, and a default source says so on its row.
166
165
 
167
- If a modality has no default and exactly one source could serve it, Kiki uses that one. If more than one could, Kiki asks you to choose rather than picking one and charging you for it.
166
+ When a modality has no default and exactly one source could serve it, Kiki uses that one. If several could, Kiki asks you to choose rather than picking one and charging you for it.
168
167
 
169
168
  ### Recent generations
170
169
 
171
- The same page lists the current session's recent media jobs, and keeps listing them when generation is off. Each one shows its state, and each file that landed is listed with a preview, a download, or an in-page player. Job states are reported as they are, including the two that are easy to get wrong:
170
+ The same page lists this session's recent media jobs and keeps listing them when generation is off. Each shows its state, and each file that landed has a preview, a download or an in-page player. Two states are worth reading carefully:
172
171
 
173
- - **Outcome unknown** — Kiki cannot confirm whether the vendor accepted the submission, so it may still be generating and charging. Nothing is regenerated automatically, and no retry is offered, because a retry is a second charge.
174
- - **Stopped** — Kiki stopped waiting locally. Whether the vendor also stopped, and whether it is still charging, is what the vendor reports; the row says which.
172
+ - **Outcome unknown** — Kiki cannot confirm whether the vendor accepted the submission, so it may still be generating and charging. Nothing is regenerated and no retry is offered, because a retry is a second charge.
173
+ - **Stopped** — Kiki stopped waiting locally. Whether the vendor also stopped, and whether it is still charging, is what the vendor reports, and the row says which.
175
174
 
176
- A job that partly finished keeps the files that landed. **Keep fetching** continues the same job through the session and agent that owns it — not through a global shortcut — and **Stop waiting** does the same. Both act only on the session that produced the job.
175
+ A job that partly finished keeps the files that landed. **Keep fetching** continues that same job through the session and agent that owns it, and **Stop waiting** does the same; both act only on the session that produced the job.
177
176
 
178
177
  ### Discovery sources
179
178
 
180
- Where new providers can be discovered from is a different question from which providers are installed, so it gets its own folded section at the bottom of the page. Adding, pausing or removing a discovery source has no effect on already-installed packages, keys or past jobs.
179
+ Where new providers can be discovered from is a different question from which ones are installed, so it has its own folded section at the bottom. Adding, pausing or removing a discovery source changes nothing about already-installed packages, keys or past jobs.
181
180
 
182
181
  ## Official Plugins
183
182
 
184
- Official plugins are plugins and built-in product capabilities maintained by Kimi. There are currently three:
183
+ The **Official** tab holds seventeen entries. Fifteen are Kiki's own, built in the [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins) and documented on this page:
184
+
185
+ - **[Kiki Writing](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-writing)**, **[Kiki Extract](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-extract)** and **[Kiki Office Suite](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-office)** — the document and writing tools described in [Local document extraction](#local-document-extraction) and below
186
+ - **[Kiki Notion](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-notion)** — connect to Notion's hosted MCP service (see [Notion material and write-back](#notion-material-and-write-back))
187
+ - **[Kiki Media](#media-sources)** and its ten provider plugins — one per image, video and speech provider
188
+
189
+ The two Kimi entries are maintained by Kimi and published on Kimi's own CDN rather than the plugin repository:
185
190
 
186
- - **[Kimi Datasource](#kimi-datasource)**: Query financial market data, macroeconomic indicators, corporate registration records, academic literature, and Chinese laws and regulations in natural language
187
- - **[Kimi Browser Extension](#kimi-browser-extension)**: Let AI drive your own browser to get web tasks done
188
- - **[Kimi Computer Use](#kimi-computer-use)**: Let AI operate your desktop apps (macOS and Windows)
191
+ - **[Kimi Datasource](#kimi-datasource)** — query market data, macro indicators, company records, academic literature and Chinese law in natural language
192
+ - **[Kimi Browser Extension](#kimi-browser-extension)** — let AI drive the browser you already use
189
193
 
190
- ### Installation and Upgrade
194
+ **[Kimi Computer Use](#kimi-computer-use)** is not in the tab at all; it installs from a direct URL, in its own section below.
191
195
 
192
- All official plugins share the same installation and upgrade flow:
196
+ **Curated** is separate: three third-party plugins from Kimi partners, each pinned to a specific commit.
197
+
198
+ ### Installing and upgrading
193
199
 
194
200
  1. Run `/plugins` and press `Tab` to select **Official**
195
- 2. Find the plugin you want and press `Enter` to install
196
- 3. After installation completes, run `/reload` or `/new` to activate it
201
+ 2. Find the plugin and press `Enter` to install
202
+ 3. Run `/reload` or `/new` to activate it
203
+
204
+ Installing downloads the published package and verifies it against the SHA256 digest in the catalog, so a package whose bytes do not match the released artifact is refused rather than installed.
197
205
 
198
206
  ::: info Note
199
- Kimi Browser Extension installs in two parts: after the steps above, you also need to [install the browser extension](#install-the-browser-extension) before it works.
207
+ Kimi Browser Extension needs a second step: after the plugin is installed, [install the browser extension](#install-the-browser-extension) too.
200
208
  :::
201
209
 
202
- Official plugins do not update automatically — when an update is available, you'll be prompted the next time you use the old version. To upgrade, repeat the installation steps above.
210
+ Official plugins do not update on their own. You are prompted the next time you use an out-of-date version, and upgrading means repeating the three steps above.
211
+
212
+ ### Working on an official plugin
213
+
214
+ The source for Kiki's own plugins is the [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins), one directory per package under `plugins/official/`. To try a change locally, clone it and install that directory from the repository root:
215
+
216
+ ```sh
217
+ git clone https://github.com/X-T-E-R/kiki-plugins
218
+ cd kiki-plugins
219
+ ```
220
+
221
+ Then, from that root, in Kiki:
222
+
223
+ ```sh
224
+ /plugins install --trust ./plugins/official/kiki-notion
225
+ /plugins enable kiki-notion
226
+ ```
227
+
228
+ That is an ordinary local install: the package is copied into `$KIKI_HOME/plugins/managed/`, and from then on you edit the checkout and run `/plugins install <same path>` again to push a change in. It is a different thing from installing from the **Official** tab, which downloads the published release. To go back to the released version, install it from the tab again.
203
229
 
204
230
  ### Kimi Datasource <Badge type="tip" text="v3.3.0" />
205
231
 
@@ -248,7 +274,7 @@ You must first complete OAuth login with a Kimi Code account via `/login`; data
248
274
 
249
275
  ### Kimi Browser Extension <Badge type="tip" text="v1.11.4" />
250
276
 
251
- Kimi Browser Extension lets AI drive your browser directly — not an emulator, not a crawler, but the browser you use every day, with your login sessions and cookies. AI can open pages, read content, click buttons, fill in forms, and take screenshots just like you do, taking repetitive web operations off your hands. See the [Kimi Browser Extension site](https://www.kimi.com/features/webbridge) for a product overview.
277
+ Kimi Browser Extension lets AI drive the browser you already use, with your own logins and cookies — not an emulator and not a crawler. It can open pages, read content, click, fill in forms and take screenshots, which takes repetitive web work off your hands. The [Kimi Browser Extension site](https://www.kimi.com/features/webbridge) has the product overview.
252
278
 
253
279
  #### Install the browser extension
254
280
 
@@ -285,7 +311,7 @@ Use this when you can't reach the stores:
285
311
 
286
312
  ### Kimi Computer Use <Badge type="tip" text="v0.5.4" />
287
313
 
288
- Kimi Computer Use lets AI operate your desktop apps directly, clicking, dragging, scrolling, and typing. The macOS version works silently in the background without taking over your mouse (a few popup actions may still bring an app to the foreground); see [the notes below](#notes-for-the-windows-version) for how the Windows version differs.
314
+ Kimi Computer Use lets AI operate your desktop apps directly — clicking, dragging, scrolling and typing. On macOS it works in the background without taking over your mouse (a few popup actions may still bring an app forward); [the Windows version](#the-windows-version) behaves differently.
289
315
 
290
316
  #### Authorization (macOS)
291
317
 
@@ -300,14 +326,14 @@ Kimi Computer Use authorization window
300
326
 
301
327
  </div>
302
328
 
303
- #### Notes for the Windows version
329
+ #### The Windows version
304
330
 
305
- The Windows version (WinCU) installs differently from the macOS one: run `/plugins install https://cdn.kimi.com/kimi-computer-use-windows/latest/kimi-cu-win-plugin.zip` in Kiki, then restart after installation. A few things to know before using it:
331
+ The Windows build (WinCU) installs differently: run `/plugins install https://cdn.kimi.com/kimi-computer-use-windows/latest/kimi-cu-win-plugin.zip` in Kiki and restart afterwards.
306
332
 
307
- - **It may briefly take over your mouse and keyboard**: Unlike the macOS version, the Windows version cannot reliably inject input in the background; it may briefly activate the target window and use your real mouse and keyboard while performing actions
308
- - **System requirements**: Windows 10 version 1903 (Build 18362) or later, or Windows 11, x64; a real interactive desktop session is required, and Windows Server needs Desktop Experience
309
- - **No extra permissions needed**: Windows does not require the Accessibility and Screen Recording grants that macOS does
310
- - **Matching privilege level**: If the target app runs as administrator, KimiCU must run at the same privilege level
333
+ - **It may briefly take over your mouse and keyboard.** Windows cannot reliably inject input in the background, so it may activate the target window and use your real input while acting.
334
+ - **Requirements:** Windows 10 version 1903 (build 18362) or later, or Windows 11, x64. It needs a real interactive desktop session, so Windows Server requires Desktop Experience.
335
+ - **No extra permissions.** Windows does not need the Accessibility and Screen Recording grants macOS asks for.
336
+ - **Matching privilege level.** If the target app runs as administrator, KimiCU must run at the same level.
311
337
 
312
338
  #### What you can do
313
339
 
@@ -318,19 +344,19 @@ The Windows version (WinCU) installs differently from the macOS one: run `/plugi
318
344
  - **Handle software that has no API**: Plenty of professional tools and internal systems have no CLI or API at all; what used to require your own clicking can now be handed to AI, like trimming the first three seconds off a clip in Final Cut Pro and exporting it
319
345
 
320
346
  ::: warning Note
321
- Don't hand it anything involving money, accounts, or publishing, such as payments and transfers, deleting important files, changing passwords, or posting content. To judge whether a task is suitable, check three things: the result is verifiable, the action is reversible, and the risk of getting it wrong is low.
347
+ Keep payments and transfers, deleting important files, changing passwords and posting content to yourself. A task suits this tool when you can check the result, undo it if it goes wrong, and the cost of a mistake is low.
322
348
  :::
323
349
 
324
- ## Plugin Manifest
350
+ ## Plugin manifest
325
351
 
326
- A plugin is a directory or zip file containing a manifest. The manifest can be placed at either of the following locations:
352
+ A plugin is a directory or zip file containing a manifest, at either of these locations:
327
353
 
328
354
  ```text
329
355
  <plugin_root>/kimi.plugin.json
330
356
  <plugin_root>/.kimi-plugin/plugin.json
331
357
  ```
332
358
 
333
- When both files exist, `kimi.plugin.json` takes precedence.
359
+ With both present, `kimi.plugin.json` wins.
334
360
 
335
361
  Example:
336
362
 
@@ -373,7 +399,7 @@ Unsupported runtime fields such as `tools`, `apps`, `inject`, and `configFile` a
373
399
 
374
400
  ### System-prompt instructions
375
401
 
376
- Use `systemPrompt` for a short inline instruction, or `systemPromptPath` to keep longer instructions in a file inside the plugin root. If both fields are present, the inline text appears first, followed by the file content. The file content is read when the plugin is installed or reloaded, so edits take effect only after `/plugins reload`. For example:
402
+ `systemPrompt` holds a short inline instruction; `systemPromptPath` keeps longer text in a file inside the plugin root. With both, the inline text comes first and the file follows. The file is read at install or reload, so edits need a `/plugins reload` to apply. For example:
377
403
 
378
404
  ```json
379
405
  {
@@ -382,19 +408,17 @@ Use `systemPrompt` for a short inline instruction, or `systemPromptPath` to keep
382
408
  }
383
409
  ```
384
410
 
385
- System-prompt contributions take effect on every surface: the interactive TUI, `kiki -p`, and `kiki web`.
386
-
387
- Each field — the inline `systemPrompt` and the `systemPromptPath` file — is limited to 32 KB (UTF-8 bytes): oversized content is ignored and reported in the plugin diagnostics. Across all enabled plugins, one prompt build injects at most 64 KB of instructions; contributions beyond the budget are skipped with a warning, including a single plugin whose inline text and file together exceed that budget.
411
+ Contributions apply on every surface: the interactive TUI, `kiki -p` and `kiki web`.
388
412
 
389
- New sessions and newly created agents read the contributions from the plugins currently enabled. An in-flight request keeps its existing system prompt. `/plugins reload` refreshes the plugin skill list and requests prompt rebuilds for live agents; use it when you need the change to converge deliberately before the next turn. Installing, enabling, disabling, or removing a plugin updates the catalog immediately, and a later prompt rebuild — for example after compaction or a tool-policy change — may pick up the new sections. A resumed session starts from its persisted prompt and uses the current plugin catalog on later rebuilds. Toggling a plugin's MCP server does not change system-prompt sections.
413
+ Each source is capped at 32 KB (UTF-8 bytes); larger content is ignored and reported in the plugin diagnostics. One prompt build takes at most 64 KB of instructions from all enabled plugins combined, and anything past that is skipped with a warning — including a single plugin whose inline text and file together exceed it.
390
414
 
391
- The built-in agent prompt includes instructions from enabled plugins automatically. A custom `SYSTEM.md` or agent file owns its template, so include `${plugin_sections}` where plugin-contributed instructions should appear. If the custom template includes `${base_prompt}` and that effective default already contains the plugin block, do not add `${plugin_sections}` again. See [Custom agents and SYSTEM.md](./agents.md#overriding-the-main-agent-s-system-prompt-with-system-md) for the complete variable table.
415
+ A new session or agent reads the contributions of the plugins enabled at that moment, while a request already in flight keeps the system prompt it started with. `/plugins reload` refreshes the skill list and asks live agents to rebuild their prompts; installing, enabling, disabling or removing a plugin updates the catalog at once, and a later rebuild — after compaction or a tool-policy change, say — picks up the new sections. A resumed session starts from its persisted prompt and uses the current catalog on later rebuilds. Toggling a plugin's MCP server does not change prompt sections.
392
416
 
393
- ## Plugin Slash Commands
417
+ The built-in agent prompt includes enabled plugins' instructions automatically. A custom `SYSTEM.md` or agent file owns its own template, so put `${plugin_sections}` where those instructions belong — and if it already includes `${base_prompt}`, which expands to a prompt containing that block, do not add `${plugin_sections}` again. [Custom agents and SYSTEM.md](./agents.md#overriding-the-main-agent-s-system-prompt-with-system-md) has the full variable table.
394
418
 
395
- Slash commands save a prompt you use often as a `/command`, so you can trigger it by typing the command instead of retyping the whole thing.
419
+ ## Plugin slash commands
396
420
 
397
- Here is a minimal end-to-end example. The plugin's directory structure:
421
+ A slash command is a prompt you use often, saved so you can trigger it by name. This is a complete example. The plugin directory:
398
422
 
399
423
  ```text
400
424
  kimi-finance/
@@ -413,7 +437,7 @@ In the manifest (`kimi.plugin.json`), the `commands` field points to where the c
413
437
  }
414
438
  ```
415
439
 
416
- The command file `commands/report.md`. The block between the two `---` lines at the top is frontmatter (metadata describing the command); everything below is the prompt sent to the Agent:
440
+ In `commands/report.md`, the block between the two `---` lines is frontmatter (metadata about the command) and everything below is the prompt sent to the agent:
417
441
 
418
442
  ```markdown
419
443
  ---
@@ -429,32 +453,32 @@ After installing and enabling the plugin, type this in the chat:
429
453
  /kimi-finance:report TSLA
430
454
  ```
431
455
 
432
- Kimi replaces `$ARGUMENTS` in the body with `TSLA`, then runs the prompt. The three details below cover each step.
456
+ Kiki replaces `$ARGUMENTS` in the body with `TSLA` and runs the prompt.
433
457
 
434
- ### Declaring Commands (the `commands` field)
458
+ ### Declaring commands (the `commands` field)
435
459
 
436
- `commands` takes a single `./` path or an array of paths, each pointing to a directory or `.md` file inside the plugin root:
460
+ `commands` takes one `./` path or an array of them, each pointing at a directory or `.md` file inside the plugin root:
437
461
 
438
- - Pointing at a **directory**: collects every `.md` file under it recursively; each becomes one command.
439
- - Pointing at a **single `.md` file**: registers just that one.
440
- - Pointing at a non-`.md` file or a missing path: appears as a diagnostic (shown in the `/plugins` panel) and is ignored.
462
+ - A **directory** contributes every `.md` file under it, recursively, one command each.
463
+ - A **single `.md` file** registers just that one.
464
+ - Anything else — a non-`.md` file or a missing path — is reported as a diagnostic in the `/plugins` panel and ignored.
441
465
 
442
- ### Writing a Command File
466
+ ### Writing a command file
443
467
 
444
- A command file has two parts: an optional **frontmatter** (the metadata between the two `---` lines at the top, where you set `name` and `description`) and the **body** (the prompt after the `---`). When a field is omitted, it falls back as follows:
468
+ A command file has an optional **frontmatter** (the metadata between the two `---` lines, where you set `name` and `description`) and the **body** after it. Omitted fields fall back as follows:
445
469
 
446
- - `name` (the command name): derived from the file's path relative to the declared `commands` path (without `.md`, using `/` separators), e.g. `commands/frontend/component.md` → `frontend/component`. A `name` set in the frontmatter takes precedence.
447
- - `description` (shown in the command list): the first non-empty line of the body (truncated past 240 characters); if the body is empty too, `No description provided.` is shown.
470
+ - `name` comes from the file's path relative to the declared `commands` path, without `.md` and with `/` separators — `commands/frontend/component.md` → `frontend/component`. A `name` in the frontmatter wins.
471
+ - `description` is the first non-empty body line, truncated past 240 characters, or `No description provided.` when the body is empty too.
448
472
 
449
- ### Running Commands and Passing Arguments
473
+ ### Running commands and passing arguments
450
474
 
451
- Commands are prefixed with the plugin id (their namespace) and registered as `<plugin>:<command>`, so the command above is actually `/kimi-finance:report` — this keeps same-named commands from different plugins from colliding.
475
+ Commands are namespaced by plugin id and registered as `<plugin>:<command>`, so the example above is really `/kimi-finance:report` — two plugins can ship the same command name without colliding.
452
476
 
453
- Whatever you type after the command replaces `$ARGUMENTS` in the body (above, `TSLA` replaces `$ARGUMENTS`). If the body has no `$ARGUMENTS` but you pass arguments anyway, they are not dropped — they are appended to the end of the body as `ARGUMENTS: <what you typed>`.
477
+ Whatever you type after the command replaces `$ARGUMENTS`. If the body has no `$ARGUMENTS` and you pass arguments anyway, they are appended to the end of the body as `ARGUMENTS: <what you typed>` rather than dropped.
454
478
 
455
479
  ## Skills and Session Start
456
480
 
457
- Plugin Skills use the same `SKILL.md` format as ordinary [Agent Skills](./skills.md). A typical directory structure:
481
+ Plugin Skills use the same `SKILL.md` format as ordinary [Agent Skills](./skills.md):
458
482
 
459
483
  ```text
460
484
  my-plugin/
@@ -466,13 +490,13 @@ my-plugin/
466
490
  SKILL.md
467
491
  ```
468
492
 
469
- `sessionStart.skill` loads a plugin Skill into the main Agent at session start, making it suitable for initialization instructions, workflow rules, or mapping terminology from other tools to Kiki. It only injects text; it does not execute code.
493
+ `sessionStart.skill` loads a plugin Skill into the main agent when a session starts, which suits initialization instructions, workflow rules or terminology mapping from another tool to Kiki. It injects text only and runs no code.
470
494
 
471
- Regardless of how a Skill is loaded (`sessionStart.skill`, `/skill:<name>`, or automatic model invocation), `skillInstructions` appears alongside that plugin's Skill.
495
+ However the Skill is loaded — `sessionStart.skill`, `/skill:<name>`, or automatic model invocation — `skillInstructions` appears alongside it.
472
496
 
473
- ## Plugin Agents
497
+ ## Plugin agents
474
498
 
475
- A plugin can ship custom agents: declare one or more `./` directories in the manifest's `agents` field (or simply place an `agents/` directory under the plugin root). The agent files inside use the same format as [custom agents](./agents.md#custom-agents) and, while the plugin is enabled, are discovered automatically and can be delegated to as sub-agents by the main Agent.
499
+ A plugin can ship agents: declare one or more `./` directories in the manifest's `agents` field, or simply have an `agents/` directory under the plugin root. The files use the same format as [custom agents](./agents.md#custom-agents) and, while the plugin is enabled, are discovered automatically and can be dispatched as sub-agents.
476
500
 
477
501
  ```text
478
502
  my-plugin/
@@ -481,13 +505,13 @@ my-plugin/
481
505
  reviewer.md
482
506
  ```
483
507
 
484
- Plugin agents rank below every other file source: on a name collision, user-level, extra, project-level, and `--agent-file` agents all win over the plugin-provided one, and replacing a built-in agent still requires an explicit `override: true` in the frontmatter. After installing, enabling, disabling, or removing a plugin, the agent list refreshes in a new session (or on `/reload`); the live session also refreshes after `/plugins reload`.
508
+ Plugin agents rank below every other file source: on a name collision, user-level, extra, project-level and `--agent-file` definitions all win, and replacing a built-in agent still needs an explicit `override: true` in the frontmatter. Installing, enabling, disabling or removing a plugin refreshes the agent list in a new session (or on `/reload`); `/plugins reload` also refreshes the live session.
485
509
 
486
- ## MCP Servers in Plugins
510
+ ## MCP servers in plugins
487
511
 
488
- When a plugin needs real tool capabilities, it can declare `mcpServers` in its manifest, reusing the [MCP](../server/mcp.md) schema.
512
+ A plugin that needs real tool capabilities declares `mcpServers` in its manifest, reusing the [MCP](../server/mcp.md) schema.
489
513
 
490
- Stdio server (local command):
514
+ Stdio server (a local command):
491
515
 
492
516
  ```json
493
517
  {
@@ -526,15 +550,15 @@ Plugin MCP servers start after `/reload` or in new sessions. To enable or disabl
526
550
 
527
551
  ### Notion material and write-back
528
552
 
529
- `kiki-notion` is a Kiki-maintained configuration and workflow for [Notion's hosted MCP service](https://developers.notion.com/guides/mcp/get-started-with-mcp), not a Notion-endorsed integration. From the repository root, install `/plugins install --trust ./plugins/official/kiki-notion`, then run `/plugins enable kiki-notion`; for an extracted package, use its directory instead. In **Capabilities → MCP**, authorize `plugin-kiki-notion:notion` through the existing browser OAuth flow, without adding a token field. Use `/reload` or a new conversation if an already-open conversation has not discovered the new MCP connection.
553
+ `kiki-notion` is a Kiki-maintained configuration and workflow for [Notion's hosted MCP service](https://developers.notion.com/guides/mcp/get-started-with-mcp), not a Notion-endorsed integration. Install **Kiki Notion** from the **Official** tab and enable it after reviewing the preview; its source lives in the independent [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-notion), not the Kiki source tree, and [Working on an official plugin](#working-on-an-official-plugin) covers installing that checkout for local work. For an extracted package, use the directory containing `kimi.plugin.json`. In **Capabilities → MCP**, authorize `plugin-kiki-notion:notion` through the normal browser OAuth flow; there is no token field to fill. If an open conversation has not picked up the new MCP connection, `/reload` or start a new one.
530
554
 
531
- Ask `/skill:notion-workspace` to search a specified page/teamspace/workspace, read key originals, and save a brief with source links to a local path. Name the destination page URL/ID and intended addition or update when you want it saved back. Summaries alone do not change Notion; an explicit write request does not add a plugin-specific confirmation, while normal Kiki tool approvals still apply. Plan/tool restrictions, dropped filters, missing subtrees, and pending async writes are reported rather than presented as complete coverage or a successful write. Access also depends on your workspace permissions and administrator policy; installation does not authorize upgrades or paid actions.
555
+ Ask `/skill:notion-workspace` to search a page, teamspace or workspace, read the key originals, and save a brief with source links to a local path. Name the destination page URL or ID, and whether to add or update, when you want it written back — a summary alone changes nothing in Notion. A write request adds no plugin-specific confirmation, and the normal Kiki tool approvals still apply. Plan and tool restrictions, dropped filters, missing subtrees and pending async writes are reported as such rather than presented as complete coverage or a successful write. Access also depends on your workspace permissions and administrator policy; installing the plugin authorizes no upgrades or paid actions.
532
556
 
533
- Notion content can reach your selected model provider, Kiki session history, and requested local files. The plugin creates no separate index or credential store. Disabling/removing it does not delete those artifacts or revoke OAuth; disconnect in MCP management and revoke service access in Notion **Settings → Connections** as needed. The package and scripted synthetic MCP chain are tested; real-account authorization/writes and autonomous model execution are not yet verified. The original package is MIT licensed; the remote service and workspace content follow the applicable [Notion agreements](https://www.notion.so/terms).
557
+ Notion content can reach your model provider, Kiki session history and any local file you asked it to write. The plugin keeps no separate index or credential store, and disabling or removing it deletes none of that or revokes the OAuth grant — disconnect it in MCP management and revoke access in Notion **Settings → Connections** if you need to. The package is MIT licensed; the remote service and workspace content follow the applicable [Notion agreements](https://www.notion.so/terms).
534
558
 
535
- ## Hooks in Plugins
559
+ ## Hooks in plugins
536
560
 
537
- A plugin can declare hook rules in its manifest that run on lifecycle events while the plugin is enabled. Each entry uses the same fields as a [`[[hooks]]` rule in `config.toml`](./hooks.md#configuration) (`event`, `matcher`, `command`, `timeout`):
561
+ A plugin can declare hook rules in its manifest that run on lifecycle events while the plugin is enabled. Each entry uses the same fields as a [`[[hooks]]` rule in `config.toml`](./hooks.md#legacy-rule-fields) (`event`, `matcher`, `command`, `timeout`):
538
562
 
539
563
  ```json
540
564
  {
@@ -549,63 +573,63 @@ A plugin can declare hook rules in its manifest that run on lifecycle events whi
549
573
  }
550
574
  ```
551
575
 
552
- Plugin hooks reuse the same mechanism as global hooks — see [Hooks](./hooks.md) for the event list, the stdin JSON payload, and how exit codes and return values affect the main flow. The differences are:
576
+ Plugin hooks work like global ones — [Hooks](./hooks.md) has the event list, the stdin JSON payload, and how exit codes affect the main flow. Three differences:
553
577
 
554
- - A plugin's hooks are active only while the plugin is **enabled**; disabling the plugin stops its hooks.
555
- - Each hook runs with its working directory set to the plugin root, so `command` can use `./` paths inside the plugin.
556
- - The hook process receives two extra environment variables: `KIKI_HOME` and `KIKI_PLUGIN_ROOT` (the plugin root directory).
578
+ - They run only while the plugin is **enabled**.
579
+ - Each hook's working directory is the plugin root, so `command` can use `./` paths inside the plugin.
580
+ - The process gets two extra environment variables: `KIKI_HOME` and `KIKI_PLUGIN_ROOT`.
557
581
 
558
- Installing a plugin never runs its hooks by itself — they only fire when their matching event occurs while the plugin is enabled.
582
+ Installing a plugin does not run its hooks; they fire when a matching event occurs while it is enabled.
559
583
 
560
584
  ## Session history import
561
585
 
562
- Kiki has built-in history import that turns another tool's text conversation into a **Kiki session you can keep working in**, or saves it as a read-only archive. Claude Code, Codex, Pi, Grok Build, OpenCode export files and custom JSON/scripts need no plugin installation, trust or activation. Import runs on the Kiki server without a model and leaves the source files unchanged; third-party plugins can still add formats through the same source contract.
586
+ Kiki can import another tool's text conversation as a **Kiki session you keep working in**, or as a read-only archive. Claude Code, Codex, Pi, Grok Build, OpenCode exports and your own JSON or script need no plugin, no trust and no activation. The import runs on the Kiki server without a model and never modifies the source files.
563
587
 
564
- History import is on by default, but does not scan folders or import anything at startup. To turn it off, start Kiki with `KIKI_EXPERIMENTAL_PLUGIN_IMPORT=false`, or set `plugin_import = false` under [`[experimental]`](../configuration/config-files.md#experimental) in `config.toml`. The existing switch name is retained; see [Environment variables](../configuration/env-vars.md#runtime-switches).
588
+ Import is on by default but scans nothing at startup. To turn it off, start Kiki with `KIKI_EXPERIMENTAL_PLUGIN_IMPORT=false`, or set `plugin_import = false` under [`[experimental]`](../configuration/config-files.md#experimental) in `config.toml`.
565
589
 
566
590
  ### Importing a conversation
567
591
 
568
- Importing needs no plugin: Kiki serves these formats itself. Open **New session** and choose **Import history** beside the starters, or go through **Capabilities** → **Plugins** → **Import history**. From there:
592
+ Open **New session** and choose **Import history** beside the starters, or go to **Capabilities** → **Plugins** → **Import history**:
569
593
 
570
- 1. Choose what the conversation becomes. **Kiki session** is the default: the conversation becomes a session in this Kiki, with its earlier turns as context, and you open it and carry on where the other tool left off. **Read-only archive** keeps it as a record you can read but not continue.
571
- 2. For a session, choose the **working directory** it runs in. Your existing workspaces are one click away, and you can type or browse for a folder that is not a saved workspace — a session started in a folder you have not opened before works the same way. Browsing does not register anything: the folder is used only if an import actually lands there.
572
- 3. Pick a format. Claude Code, Codex, Pi, Grok and OpenCode are built in, as is a custom script of your own; nothing is installed, trusted or enabled to reach this page. A third-party plugin's own source appears here too, once it is installed and enabled.
573
- 4. Choose the **Source home** — the folder the other tool keeps its history in, on the machine running the server. Kiki reads only that folder.
574
- 5. Pick a conversation from the list. A folder holding many histories is listed one page at a time.
575
- 6. Read the preview. It says whether the source could read the conversation at all, what would be kept, what would not be carried over, and where the result lands. **Complete read** means the source read the whole conversation; **Sample** means it read part of it.
576
- 7. Choose **Import as session** or **Start import**. That is the one confirmation this conversation gets: the import runs under the preview you just read.
594
+ 1. **What it becomes.** **Kiki session** (the default) turns the conversation into a session in this Kiki, its earlier turns as context, so you open it and carry on where the other tool stopped. **Read-only archive** keeps it as a record you can read but not continue.
595
+ 2. **Working directory** (for a session). Your workspaces are one click away, and you can type or browse for any folder — a session in a folder you have not opened before works the same. Browsing registers nothing; the folder is used only if an import actually lands there.
596
+ 3. **Format.** Claude Code, Codex, Pi, Grok and OpenCode are built in, as is a custom script of your own. A third-party plugin's source appears here once it is installed and enabled.
597
+ 4. **Source home** — the folder where the other tool keeps its history, on the machine running the server. Kiki reads only that folder.
598
+ 5. **Conversation.** A folder with many histories is listed one page at a time.
599
+ 6. **Preview.** It says whether the source could read the conversation at all, what is kept, what is not carried over, and where the result lands. **Complete read** means the whole conversation was read; **Sample** means part of it.
600
+ 7. **Import as session** or **Start import** — the one confirmation this flow asks for; the import runs under the preview you just read.
577
601
 
578
- An archive is written into the home of the Kiki server this window is connected to — **Imports into** names it. A session is created in the working directory you chose, on that same server. Neither ever lands in the source folder. A preview belongs to the server that made it, so after connecting to a different Kiki, preview the conversation again.
602
+ An archive is written into the home of the Kiki server this window is connected to — **Imports into** names it — and a session is created in the working directory you chose on that same server. Neither ever lands in the source folder. A preview belongs to the server that produced it, so preview again after connecting to a different Kiki.
579
603
 
580
- Progress reports bytes read from the source, and a source the server has not measured yet shows an indeterminate line instead of a percentage. **Stop import** ends a running import, and an import that was stopped, failed, or interrupted by a restart keeps its place and offers **Continue import**. A finished import offers **Open session** when it became a session, and **Open archive** when it became an archive — never both, because it only ever writes one.
604
+ Progress shows bytes read from the source; a source not yet measured shows an indeterminate line instead of a percentage. **Stop import** ends a running one, and an import that was stopped, failed or interrupted by a restart keeps its place and offers **Continue import**. A finished import offers **Open session** or **Open archive**, depending on what it became.
581
605
 
582
- ### What a session keeps, and what it does not
606
+ ### What a session keeps
583
607
 
584
- A session import turns the conversation into context Kiki can continue from, which is what makes the migration painless, and it is not the same promise an archive makes. User and assistant text becomes the session's earlier turns. A tool call from the old conversation arrives as text saying it already happened — it is never re-run, and it grants no permission here. The other tool's system instructions, metadata, usage counts, approvals and running tasks are not installed as this Kiki's own state, and the preview lists that as a loss.
608
+ A session import turns the conversation into context Kiki can continue from. User and assistant text becomes the session's earlier turns. A tool call from the old conversation arrives as text saying it already happened — it is never re-run and grants no permission here. The other tool's system instructions, metadata, usage counts, approvals and running tasks are not installed as this Kiki's state, and the preview lists each as a loss.
585
609
 
586
- Importing the same source conversation and revision into the same working directory reuses the existing session without replacing any continuation you have added in Kiki. The preview says so before you start. A changed revision imports as a new session, leaving the one you already had alone.
610
+ Importing the same conversation and revision into the same working directory reuses the existing session without replacing anything you have added in Kiki, and the preview says so before you start. A changed revision imports as a new session, leaving the old one alone.
587
611
 
588
- Opening a migrated session needs a model like any other session: importing and reading do not, sending your next message does.
612
+ A migrated session needs a model like any other: importing and reading do not, sending your next message does.
589
613
 
590
- ### What an archive keeps, and what it does not
614
+ ### What an archive keeps
591
615
 
592
- An archive is history, not a live conversation: it cannot be continued, and opening it does not add its content to this session. It is also not a session of its own — it has no place in the session list and is read from the import page's own archive list, without a model. Records keep the roles they had in the other tool — user, assistant, system, tool call, metadata — but nothing is replayed. A tool call in the history stays a record, and text that was a system instruction to that tool is not executed here. Token counts the other tool recorded stay in the metadata and are not counted as usage on this machine.
616
+ An archive is history, not a live conversation. It cannot be continued, opening it does not add its content to this session, and it is not a session of its own — it has no place in the session list and is read from the import page's archive list, without a model. Records keep the roles they had in the other tool — user, assistant, system, tool call, metadata — but nothing is replayed: a tool call stays a record, and text that was a system instruction to that other tool is not executed here. Token counts the other tool recorded stay in the metadata and are not counted as usage on this machine.
593
617
 
594
- The preview's loss list is the part of the feature that tells you what you are not getting, so read it before importing:
618
+ The preview's loss list tells you what you are not getting, so read it before importing:
595
619
 
596
- - **Attachments are not copied.** An image, document, or other embedded file leaves a placeholder in the text and a loss entry with a count; the conversation around it stays readable.
597
- - **Unknown or omitted content is reported.** Claude Code and Codex can preserve unknown rows as metadata; the other rules report unsupported records or parts as counted losses. No rule turns an omitted part into a claim of complete preservation.
598
- - **Malformed input is not hidden.** Claude Code and Codex report unparseable rows in their losses. Pi, Grok, OpenCode and the bundled custom JSON reader reject malformed JSON or invalid required relationships rather than silently skipping them. A preview distinguishes a sample from a complete read.
620
+ - **Attachments are not copied.** An image, document or other embedded file leaves a placeholder in the text and a counted loss entry; the conversation around it stays readable.
621
+ - **Unknown or omitted content is reported.** Claude Code and Codex can preserve unknown rows as metadata; the other rules report unsupported records or parts as counted losses. Nothing is ever reported as preserved when it was omitted.
622
+ - **Malformed input is not hidden.** Claude Code and Codex report unparseable rows in their losses, while Pi, Grok, OpenCode and the bundled custom JSON reader reject malformed JSON or invalid required relationships instead of skipping them silently. A preview distinguishes a sample from a complete read.
599
623
 
600
- Claude Code and Codex reject a source folder deeper than 20 levels and a single input line over 128 MiB. Pi, Grok, OpenCode and the bundled custom JSON reader limit each input file to 64 MiB; Grok's summary and update files each have that limit. A custom script controls its own input limits and must report them honestly.
624
+ Claude Code and Codex reject a source folder deeper than 20 levels and a single input line over 128 MiB. Pi, Grok, OpenCode and the bundled custom JSON reader cap each input file at 64 MiB, and Grok's summary and update files have that limit each. A custom script sets its own limits and has to report them honestly.
601
625
 
602
- Kiki identifies a conversation by its source, source home, and the other tool's own id, and treats the revision seen in the preview as its content version. Importing the same revision again reuses the archive already there, and a changed conversation imports as a new revision of that archive. If the file changes between the preview and the import, the import fails and the existing archive is kept. Archives are found by title or source id — a lookup over what you have imported, not a full-text search.
626
+ Kiki identifies a conversation by its source, source home and the other tool's own id, and treats the previewed revision as its content version. Importing the same revision again reuses the existing archive; a changed conversation becomes a new revision of it. If the file changes between preview and import, the import fails and the existing archive is kept. Archives are found by title or source id — a lookup over what you imported, not a full-text search.
603
627
 
604
- When the window is connected to a Kiki on another machine, that server's sources, imports, and archives are readable here, but starting, stopping, and continuing an import belong to the machine that owns the home.
628
+ When this window is connected to a Kiki on another machine, that server's sources, imports and archives are readable here, but starting, stopping and continuing an import belongs to the machine that owns the home.
605
629
 
606
630
  ### Built-in formats and custom scripts
607
631
 
608
- Choose a folder containing the format below, not necessarily the other tool's entire home. For OpenCode, first export the session to a local JSON file.
632
+ Choose a folder holding the format below — it need not be the other tool's whole home. For OpenCode, export the session to a local JSON file first.
609
633
 
610
634
  | Source | Supported input |
611
635
  | --- | --- |
@@ -623,13 +647,13 @@ For another format, select **Custom JSON / script** and set **Custom import scri
623
647
  customScript = "C:/imports/my-format.mjs"
624
648
  ```
625
649
 
626
- Leave the setting empty to use the bundled JSON reader. A script exports `discover(input, context)`, `probe(input, context)` and `parse(input, context)` using the [source method shapes below](#writing-an-import-source); it does not need a plugin manifest, `register(api)` or an SDK dependency. `context` supplies `signal` and `settings`. The standalone [custom JSON example](https://github.com/X-T-E-R/kiki/blob/main/packages/agent-core-v2/src/app/pluginImport/builtin/examples/custom-json.mjs) can be copied and adapted; it is also included with the built-in resources.
650
+ Leave the setting empty to use the bundled JSON reader. A script exports `discover(input, context)`, `probe(input, context)` and `parse(input, context)` in the [shapes below](#writing-an-import-source); it needs no plugin manifest, `register(api)` or SDK dependency, and `context` supplies `signal` and `settings`. The standalone [custom JSON example](https://github.com/X-T-E-R/kiki/blob/main/packages/agent-core-v2/src/app/pluginImport/builtin/examples/custom-json.mjs) can be copied and adapted.
627
651
 
628
- Choose only code you trust: a custom script runs as Node.js with your account's permissions, not in a sandbox. Selecting the script is the explicit choice to run it; there is no additional installation or per-call approval. Changing its code or settings changes the preview revision, so preview again before importing. Kiki still checks the returned records and pages against the shared source contract.
652
+ Choose code you trust: the script runs as Node.js with your account's permissions, not in a sandbox, and selecting it is the decision to run it — there is no further installation or per-call approval. Changing its code or settings changes the preview revision, so preview again before importing. Kiki still checks the records and pages it returns against the shared source contract.
629
653
 
630
654
  ### Writing an import source
631
655
 
632
- An import source is one of the contributions a plugin can declare, so it lives in the same manifest: list `x-kiki.sessionSources`, point `x-kiki.entry` at an ES module, and export `register(api)` from that module. The manifest declares what the plugin offers; the entry does the reading.
656
+ A plugin declares an import source in its own manifest: list `x-kiki.sessionSources`, point `x-kiki.entry` at an ES module, and export `register(api)` from that module. The manifest declares what the plugin offers, the entry does the reading.
633
657
 
634
658
  ```json
635
659
  {
@@ -652,19 +676,19 @@ An import source is one of the contributions a plugin can declare, so it lives i
652
676
  }
653
677
  ```
654
678
 
655
- - `sessionSources` lists the sources this plugin registers. Each `id` matches `[a-z0-9][a-z0-9-]{0,63}` and must be unique within the plugin; `label` is what the source picker shows, and `formatVersion` names the format you read. A declared source the entry never registers fails when it is used instead of quietly doing nothing.
656
- - `entry` is required for a plugin with session sources and must resolve inside the plugin root. Kiki loads it as an ES module in its own Node.js process, so build your TypeScript down to the file you name here.
657
- - `permissions.fs: "outside"` is what an importer declares to read a folder outside the workspace, which is what a source home is. `engines.kiki` is required as soon as a plugin declares Kiki contributions.
679
+ - `sessionSources` lists what the plugin registers. Each `id` matches `[a-z0-9][a-z0-9-]{0,63}` and is unique within the plugin, `label` is what the source picker shows, and `formatVersion` names the format you read. A declared source the entry never registers fails when used, rather than quietly doing nothing.
680
+ - `entry` is required for a plugin with session sources and must resolve inside the plugin root. Kiki loads it as an ES module in its own Node.js process, so build your TypeScript down to the file you name.
681
+ - `permissions.fs: "outside"` is how an importer declares that it reads a folder outside the workspace, which is what a source home is. `engines.kiki` is required as soon as a plugin declares Kiki contributions.
658
682
 
659
- The adapter offers three methods, and the definition passed to `registerSessionSource` must be the one the manifest declares:
683
+ Register a definition that matches the manifest, and implement three methods:
660
684
 
661
685
  - `discover` lists the conversations a folder holds for one source home, paging with the `cursor` it is given.
662
- - `probe` reports one conversation: its content `revision`, title, `status` (`preserved`, `partial`, or `unsupported`), losses, total size, and canonical `sourceHome`. The archive identity includes that home, so return one spelling of a folder rather than a path the user could write two ways.
663
- - `parse` returns records in pages, with the `cursor` that continues the read. `context.signal` is aborted when the reader stops the import, when the plugin is unloaded, or when a page runs past its timeout, and `context.settings` carries the plugin's own settings.
686
+ - `probe` reports one conversation: content `revision`, title, `status` (`preserved`, `partial` or `unsupported`), losses, total size, and canonical `sourceHome`. Archive identity includes that home, so return one spelling of the folder rather than a path a user could write two ways.
687
+ - `parse` returns records in pages with the `cursor` that continues the read. `context.signal` aborts when the reader stops the import, the plugin unloads, or a page runs past its timeout, and `context.settings` carries the plugin's own settings.
664
688
 
665
- An honest source is worth more than a complete-looking one: give every loss a `code`, a `count`, and a `detail` instead of importing only the part you can read, and never treat history text as instructions to run. Each record holds at most 49,152 UTF-16 code units, so a longer message becomes several records that share an `id` and carry `part`, `textOffset`, and `textTotal`.
689
+ Report every loss with a `code`, a `count` and a `detail` rather than importing only the part you can read, and never treat history text as instructions to run. Each record holds at most 49,152 UTF-16 code units, so a longer message becomes several records sharing an `id` and carrying `part`, `textOffset` and `textTotal`.
666
690
 
667
- The example below is a working source for a folder holding one `history.json`; the record, page, and probe shapes come from the public `@kiki/plugin-sdk` package, whose `session-import` entry point exports them.
691
+ The example below is a working source for a folder holding one `history.json`; the record, page and probe shapes come from the public `@kiki/plugin-sdk` package's `session-import` entry point.
668
692
 
669
693
  ```ts
670
694
  import { createHash } from 'node:crypto';
@@ -748,14 +772,14 @@ export function register(api: PluginRegistrationApi): void {
748
772
  }
749
773
  ```
750
774
 
751
- ## Security Model
775
+ ## What installing a plugin does and does not do
752
776
 
753
- Plugins have a limited loading scope. The following operations do not occur during installation or session startup:
777
+ Installing a plugin copies its files and reads its manifest. None of these happens at install or session startup:
754
778
 
755
- - Unsupported runtime fields such as `tools`, `apps`, `inject`, and `configFile` are ignored rather than executed
756
- - All paths must remain within the plugin root directory after symbolic link resolution
757
- - MCP servers of enabled plugins start after `/reload` or in new sessions and can be disabled at any time from `/plugins`
758
- - Installing a plugin does not run its entry file: plugin code starts when you use the contribution, in a Node.js process holding your account's permissions ([not a sandbox](#installing-a-plugin-that-runs-code))
759
- - Broken manifests or unsafe paths appear in `/plugins info <id>` diagnostics and do not affect other sessions
779
+ - Unsupported runtime fields such as `tools`, `apps`, `inject` and `configFile` are ignored rather than executed
780
+ - Every path stays inside the plugin root after symbolic links are resolved
781
+ - MCP servers start only after a `/reload` or in a new session, and can be disabled at any time from `/plugins`
782
+ - The entry file does not run at install; plugin code starts when you use the contribution, in a Node.js process holding your account's permissions ([not a sandbox](#installing-a-plugin-that-runs-code))
783
+ - A broken manifest or unsafe path shows up in `/plugins info <id>` diagnostics and affects no other session
760
784
 
761
785
  [Online version with images](https://x-t-e-r.github.io/kiki/en/customization/plugins.html)