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,15 +1,15 @@
1
1
  # `kiki` Command
2
2
 
3
- `kiki` is the product's unified CLI entry — the terminal form of the three-form product (desktop app, CLI/TUI, and server) — covering the daemon-backed interactive TUI, non-interactive `-p` mode, and shared-daemon controls. Running it without arguments attaches to an existing healthy daemon or starts one after workspace trust; `kiki -p` keeps the SDK-backed non-interactive path separate. Use `kiki serve` to control the daemon explicitly, and `kiki web` for the compatible foreground server/UI command. Its seat and MCP subcommands let external callers such as Cursor, Claude Code, and Codex call Kiki (inbound); they do not configure the external executors that Kiki uses to run subagents (outbound).
3
+ `kiki` is the command-line entry to Kiki. It covers the interactive TUI, non-interactive `-p` mode, and shared-daemon controls. Running it with no arguments attaches to an existing healthy daemon or starts one after workspace trust; `kiki -p` runs a single prompt and exits. Use `kiki serve` to control the daemon explicitly and `kiki web` for the foreground server and browser UI. The seat and MCP subcommands let external callers such as Cursor, Claude Code, and Codex call Kiki.
4
4
 
5
5
  ```sh
6
6
  kiki [options]
7
7
  kiki <subcommand> [options]
8
8
  ```
9
9
 
10
- Interactive sessions always use the shared background daemon. After workspace trust is confirmed, the CLI attaches to an existing daemon or starts one automatically; no separate installation or experimental flag is required. If connection or startup fails, the error is shown instead of falling back to an independent local session. Correct the reported error and run the command again. Non-interactive `--prompt` execution is separate from this terminal startup path.
10
+ Interactive sessions always use the shared background daemon. After workspace trust is confirmed, the CLI attaches to an existing daemon or starts one automatically. If that fails, Kiki shows the error rather than falling back to a separate local session — fix what the error names and run the command again.
11
11
 
12
- Interactive mode needs a terminal on both stdin and stdout. A pipe or a redirect on either one ends the run before workspace trust and the daemon are involved — Kiki does not switch to non-interactive mode for you. To supply a prompt from a pipe, run `kiki -p -` and let Kiki read the prompt from stdin.
12
+ Interactive mode needs a terminal on both stdin and stdout. A pipe or a redirect on either one ends the run before workspace trust and the daemon are involved, and Kiki does not switch to non-interactive mode for you. To supply a prompt from a pipe, run `kiki -p -` and let Kiki read the prompt from stdin.
13
13
 
14
14
  ## Main Command Options
15
15
 
@@ -265,7 +265,11 @@ Recovery and removal have different meanings:
265
265
  - `clear-queue <id> --agree` explicitly discards pending data and disables that destination. `remove <id>` removes local configuration and its secret; add `--discard-pending` only when you want to discard an existing queue. Neither deletes remote history, and delivery identity/revision evidence is retained.
266
266
  - `withdraw <id> --agree` sends versioned deletion tombstones only where the receiver supports deletion. It does not delete local usage; vibe does not support this operation.
267
267
 
268
- For an existing vibe collector, use `handoff plan <id>` on a new native draft, prepare the collector's `kiki-handoff.json` for the returned namespace and future UTC cutoff **T**, then run native `preview` and `test`. `handoff arm <id> --collector-file <file> --fingerprint <preview_fingerprint> --agree` verifies the marker against the saved native credential, activates only that home's collector cutoff, and enables native delivery from the fixed T. It does not read the collector's key or stop its daemon. Different keys are not treated as proof of the same remote account. The collector remains responsible for `<T`, native for `>=T`; offline catch-up keeps T rather than using ACK time. `handoff refresh <id>` reads the collector's safe final receipt; completion requires both the old receipt and a real native ACK. `handoff rollback <id> --cutoff <new_future_R> --agree` keeps native responsible for `[T,R)` and resumes the collector at `>=R`, not an unbounded old scan.
268
+ To hand a home over from an existing vibe collector, use `handoff plan <id>` on a new native draft, prepare the collector's `kiki-handoff.json` for the returned namespace and future UTC cutoff **T**, then run native `preview` and `test`.
269
+
270
+ `handoff arm <id> --collector-file <file> --fingerprint <preview_fingerprint> --agree` verifies the marker against the saved native credential, activates only that home's collector cutoff, and enables native delivery from the fixed T. It does not read the collector's key or stop its daemon, and different keys are not treated as proof of the same remote account.
271
+
272
+ The collector stays responsible for `<T` and native for `>=T`; offline catch-up keeps T rather than using ACK time. `handoff refresh <id>` reads the collector's safe final receipt, and completion requires both that receipt and a real native ACK. `handoff rollback <id> --cutoff <new_future_R> --agree` keeps native responsible for `[T,R)` and resumes the collector at `>=R`, never an unbounded old scan.
269
273
 
270
274
  Receiver developers can run the repository's local example with `pnpm exec tsx packages/kap-server/examples/usage-export-receiver.ts` (Node 24). It binds only `127.0.0.1:9080`, persists replacements and deletion tombstones in `usage-receiver.sqlite`, and exposes `POST /usage`. Approve the exact loopback HTTP grant when testing it. A production receiver needs TLS, durable storage, and authentication; the example is not a hosted dashboard.
271
275
 
@@ -1,6 +1,16 @@
1
1
  # Keyboard Shortcuts
2
2
 
3
- Kiki's TUI shortcuts are grouped by context: general input, mode switching, editing, streaming, tool output, approval panels, and help navigation. Type `/help` to browse command usage, descriptions, support status, and input shortcuts.
3
+ This page covers GUI thread navigation, followed by TUI shortcuts grouped by context: general input, mode switching, editing, streaming, tool output, approval panels, and help navigation. In the TUI, type `/help` to browse command usage, descriptions, support status, and input shortcuts.
4
+
5
+ ## Desktop and web thread navigation
6
+
7
+ In the GUI, open Settings → Shortcuts to rebind **Next running thread** and **Previous running thread**. The defaults are `Ctrl-Tab` and `Ctrl-Shift-Tab`, respectively. Browsers own these tab-switching chords; choose different bindings to use the actions on the web. Existing custom bindings remain unchanged. If a custom binding already uses `Ctrl-Shift-Tab`, the new previous-thread action stays unbound until you assign a free chord.
8
+
9
+ These actions cycle through running sessions already loaded in the current window's session list, within its connection and fetched workspace/archive scope. They use creation time, newest first, rather than pin order or recent updates. From a thread outside that set, Next enters the first running thread and Previous enters the last. With no running threads they do nothing; with one, they stay on it.
10
+
11
+ A running session has an active main or subagent turn, or background work. A pending approval/question alone, unread output, or a pinned session does not make it running. A session that still has running work remains eligible even if it also needs your input.
12
+
13
+ Switching conversations through these shortcuts, the sidebar, or the quick switcher focuses the current editable composer once it is ready. Drafts and unchanged draft selections are retained without scrolling the transcript to the composer. Open dialogs and terminal input keep their focus; ordinary Tab, Shift-Tab and IME text input keep their usual behavior.
4
14
 
5
15
  ## General Shortcuts
6
16
 
@@ -29,7 +39,7 @@ During streaming, `Ctrl-C` clears a nonempty draft first. With the input box emp
29
39
 
30
40
  Press `Shift-Tab` to enable or disable Plan mode. When enabled, the Agent prioritizes read-only tools for research and planning and can write to the current plan file; `Bash` is subject to the current permission mode and regular rules, without any additional separate approval triggered by Plan mode. Simply toggling does not create an empty plan file. Press `Shift-Tab` again to exit Plan mode.
31
41
 
32
- Type `!` in an empty input box to enter shell mode and run terminal commands directly. The active-turn backgrounding shortcut `Ctrl-B` is disabled in the daemon TUI. See [Interaction and input](../guides/interaction.md#shell-mode).
42
+ Type `!` in an empty input box to enter shell mode and run terminal commands directly. See [Interaction and input](../guides/interaction.md#shell-mode).
33
43
 
34
44
  ## Input & Editing
35
45
 
@@ -60,8 +70,12 @@ While streaming output is active, the input box can still receive input and supp
60
70
  | --- | --- |
61
71
  | `Esc` | Interrupt the current streaming output |
62
72
  | `Ctrl-C` | Clear a nonempty draft first; interrupt the active turn when the input is empty |
63
- | `Ctrl-S` | Disabled: the prompt-steering shortcut does not inject input into the active turn |
64
- | `Ctrl-B` | Disabled: the active turn cannot be moved to the background with this shortcut |
73
+ | `Ctrl-S` | Steer the running turn: send the queued messages and the current draft into it now instead of waiting for the turn to end |
74
+ | `Ctrl-B` | Move the running turn to the background, leaving you free to queue the next instruction |
75
+
76
+ `Ctrl-S` steers in queue order. Shell commands (`! …`) and inline Skill invocations are never steered in — they stay queued and run after the current turn, and everything queued behind such an item waits with them.
77
+
78
+ Both shortcuts are unavailable in the daemon TUI (`kiki web`), which reports them as disabled.
65
79
 
66
80
  ## Tool Output
67
81
 
@@ -23,15 +23,15 @@ A newly spawned subagent selects its model in this order:
23
23
  2. The `model_alias` pin on the effective profile, route, or caller lease (constraints an external delegating host pre-sets for the caller).
24
24
  3. Explicitly configured `[subagent].default_model`.
25
25
 
26
- With none of these sources, the spawn fails with `model.not_configured`; neither the caller's model nor the main-agent `default_model` is a silent fallback. Explicit `model_alias: inherit` on the profile, route, or caller lease binds the caller's current resolved model and effective thinking effort unless explicit tool `effort` or an applicable profile, route, lease, or matching `model_profiles` effort pin wins. `AgentRun` rejects `model_alias: "inherit"`: specify a concrete configured model name, or omit the parameter to use the target default. Unknown concrete aliases and machine-denied models fail before the child starts. A model outside explicit preferences or different from a route/caller-lease pin continues with an advisory only when executable and inside every hard model and effort boundary.
26
+ With none of these sources, the spawn fails with `model.not_configured`; neither the caller's model nor the main-agent `default_model` is a silent fallback. `model_alias: inherit` on a profile, route, or caller lease binds the caller's current model and thinking effort unless an explicit tool `effort` or an applicable effort pin overrides them. `AgentRun` itself rejects `model_alias: "inherit"` — pass a concrete configured model name, or omit the parameter to use the target default. An unknown alias or a model on a denylist fails before the child starts. Choosing a model outside `preferred_models` / `discouraged_models` is allowed as long as it is inside every hard model and effort limit.
27
27
 
28
28
  A resumed or retried subagent keeps its persisted binding unless the `AgentRun` `resume` explicitly requests a change. Omitting both `model_alias` and `effort` keeps the current binding; an explicit effort applies to the next idle run. `AgentRun` rejects `model_alias: "inherit"` on resume as well; specify a concrete model name for an explicit change, or omit it to keep the saved model. Switching to a different canonical model requires `allow_model_change: true`; an alias resolving to the same canonical model is a no-op.
29
29
 
30
30
  ## Agent files and routes
31
31
 
32
- Agent files and profile route sidecars pin models with `model_alias`; a main-agent profile cannot use `inherit` because it has no caller. The legacy `model_preference` field is explicitly rejected with a migration diagnostic; unknown `model` metadata written by other tools also fails closed. Remove unsupported fields instead of relying on them being ignored.
32
+ Agent files and profile route sidecars pin models with `model_alias`; a main-agent profile cannot use `inherit` because it has no caller. A legacy `model_preference` field is rejected with a migration message, as is unknown `model` metadata left behind by other tools — remove fields that are not supported rather than expecting them to be ignored.
33
33
 
34
- A route-declared `model_alias` is a soft default. For subagents, an executable, hard-permitted override stays tied to the route, is marked detached, and carries an advisory. `allowed_models`, `deny_models`, and `allowed_efforts` are hard in profiles, leases, `spawn_constraints`, and matching `model_profiles`; a violation rejects subagent binding, manual changes, and resume. In a main session, user selections override profile model / effort rules: hard violations only warn, and recommendation or pin deviations do not warn or block sending. Only `preferred_models`, `discouraged_models`, and `preferred_efforts` are recommendations. Machine `[subagent].deny_models` adds another hard boundary. Native model lists compare canonical identities; external executors compare actual effective model IDs.
34
+ A route-declared `model_alias` is a soft default, and `preferred_models`, `discouraged_models`, and `preferred_efforts` are recommendations. `allowed_models`, `deny_models`, and `allowed_efforts` are hard limits: in a subagent, going outside them rejects the binding, a manual change, or a resume. In a main session your own selection wins, and a violation only warns. `[subagent].deny_models` adds a further hard limit. Native model lists compare canonical identities; external executors compare the effective model IDs they actually call.
35
35
 
36
36
  ## Settings by identity
37
37
 
@@ -41,13 +41,11 @@ A model carries one set of shared settings: its default thinking effort, service
41
41
  - **Main agent**: applies when the model is used as the main agent, whichever profile happens to hold it. An unset field inherits.
42
42
  - **Externally delegated agent**: applies to agents delegated in from an external host. An unset field inherits.
43
43
 
44
- Identity is who the model is serving, not which profile is selected, so switching profiles does not drop this layer. Overriding a prompt or cognition field is a different mechanism: those replace a whole group of values, while a setting above merges one field at a time. The two do not change each other.
44
+ Identity is who the model is serving, not which profile is selected, so switching profiles does not drop this layer. Overriding a prompt or cognition field is a different mechanism: those replace a whole group of values, while a setting here changes one field at a time. Clearing an override returns the field to the shared value. `usage_effective` and `usage_sources` report the value each identity resolves to and where it was read from; they describe the model's own resolution, and do not include a profile pin or a session override.
45
45
 
46
- A cleared override goes straight back to the shared value. `usage_effective` and `usage_sources` report the value each identity resolves to and where it was read from; they describe the model's own resolution, and do not include a profile pin or a session override.
46
+ The context budget and the generated-token ceiling are caps, not preferences: the effective value is the lower of the shared cap and any identity value, so an identity can tighten them but never raise them past what the model allows.
47
47
 
48
- The context budget and the generated-token ceiling are caps, not preferences: the effective value is the lower of the shared cap and any identity difference, so an identity can tighten them but never raise them past what the model allows.
49
-
50
- In Settings › Models, the model editor opens on the shared values; switch to Main agent to see and edit only that identity's differences, and the editor shows what each field inherits and what it resolves to. A model on a server without this layer simply has no difference to edit.
48
+ In Settings › Models, the model editor opens on the shared values; switch to Main agent to see and edit only that identity's differences, and the editor shows what each field inherits and what it resolves to.
51
49
 
52
50
  ## Model ID resolution
53
51
 
@@ -14,7 +14,7 @@ Some commands are only available in the idle state. Executing these commands whi
14
14
  | --- | --- | --- | --- |
15
15
  | `/login` | — | Select an account or platform and log in: Kimi Code uses OAuth device-code flow; Kimi Platform uses API key login | No |
16
16
  | `/logout` | — | Clear credentials for the currently selected account | No |
17
- | `/provider` | — | Open the interactive provider manager to view, add, and remove configured providers. See [Platforms & Models — `/provider` and provider management](../configuration/providers.md#provider-—-interactive-provider-management) | Yes |
17
+ | `/provider` | — | Open the interactive provider manager to view, add, and remove configured providers. See [Providers and models — `/provider`](../configuration/providers.md#provider-—-interactive-provider-management) | Yes |
18
18
  | `/model` | — | Switch the LLM model used in the current session | Yes |
19
19
  | `/settings` | `/config` | Open the settings panel inside the TUI | Yes |
20
20
  | `/experiments` | `/experimental` | Open the experimental feature panel | Yes |
@@ -130,7 +130,7 @@ All built-in Skill commands are only available in the idle state.
130
130
 
131
131
  Activated external Skills are automatically registered as slash commands. Ordinary external Skills use the `skill:` namespace prefix:
132
132
 
133
- ```
133
+ ```text
134
134
  /skill:<name> [extra text]
135
135
  ```
136
136
 
@@ -138,7 +138,7 @@ For example, `/skill:code-style` loads the Skill named `code-style` and sends it
138
138
 
139
139
  External sub-skills appear directly in the slash command panel with dotted names:
140
140
 
141
- ```
141
+ ```text
142
142
  /<parent-skill>.<sub-skill> [extra text]
143
143
  ```
144
144
 
@@ -146,7 +146,7 @@ For example, a child Skill named `review` inside a parent Skill named `code-styl
146
146
 
147
147
  For convenience, external Skill commands also support a shorthand form that omits the `skill:` prefix — `/<name>` — as long as the name is not taken by a system slash command. That is, `/code-style` falls back to matching `/skill:code-style`.
148
148
 
149
- ::: info
149
+ ::: tip
150
150
  All Skill commands are only available in the idle state. `flow`-type Skills are also exposed via `/skill:<name>` — there is no separate `/flow:` namespace.
151
151
  :::
152
152
 
@@ -17,7 +17,11 @@ File tools handle reading, writing, and searching the local filesystem — the f
17
17
  | `Glob` | Auto-allow | Find files by glob pattern |
18
18
  | `ReadMediaFile` | Auto-allow | Read an image or video file |
19
19
 
20
- **`Read`** accepts a file path (`path`) plus optional `line_offset` (starting line number; negative values count from the end) and `n_lines` (maximum number of lines to read). Returns at most 1000 lines or 100 KB per call; content beyond that limit is accompanied by a truncation notice. UTF-8 and UTF-16 text are supported; UTF-16 is converted for display. The result shows line numbers and reports original line endings; a pure CRLF file appears as LF in `Read`, and `Edit` preserves CRLF when using that view. Mixed line endings require matching the visible `\r` characters exactly. If the file is an image or video, the tool suggests using `ReadMediaFile` instead. An explicit absolute path can read outside the workspace, subject to sensitive-file approval. Registered user skill and agent definition roots (including linked installations) are readable by default; ordinary workspace links to external files require approval. Only `~/.kiki/agents`, `skills`, `commands`, and `docs` under `~/.kiki` are treated as definition or documentation roots; other paths there require explicit paths and remain subject to sensitive-file rules.
20
+ **`Read`** accepts a file path (`path`) plus optional `line_offset` (starting line number; negative values count from the end) and `n_lines` (maximum number of lines to read). Returns at most 1000 lines or 100 KB per call; content beyond that limit comes with a truncation notice. UTF-8 and UTF-16 text are supported, with UTF-16 converted for display. If the file is an image or video, the tool suggests using `ReadMediaFile` instead.
21
+
22
+ The result shows line numbers and reports the original line endings. A pure CRLF file appears as LF in `Read`, and `Edit` preserves CRLF when you edit that view; a file with mixed line endings needs the visible `\r` characters matched exactly.
23
+
24
+ An explicit absolute path can read outside the workspace, subject to sensitive-file approval. Registered user Skill and agent definition roots (including linked installations) are readable by default, while an ordinary workspace link to an external file requires approval. Under `~/.kiki`, only `agents`, `skills`, `commands`, and `docs` count as definition or documentation roots; other paths there still need an explicit path and remain subject to the sensitive-file rules.
21
25
 
22
26
  **`Write`** accepts `path`, `content`, and an optional `mode` (`overwrite` or `append`; defaults to overwrite). Missing parent directories are created automatically; `append` mode appends content to the end of the file without automatically adding a newline.
23
27
 
@@ -48,7 +52,11 @@ Use `offset` (default 0) and `head_limit` (default 100) to page through matching
48
52
 
49
53
  When a command is only a file read, search, or text-file write, `Bash` still runs it but may append a one-line hint pointing to `Read`, `Grep`/`Glob`, or `Write`/`Edit`. Each hint category appears at most three times per session. Set `bash_file_tool_hints = false` under [`[background]`](../configuration/config-files.md#background) to suppress these hints; execution and approval behavior are unchanged.
50
54
 
51
- Foreground mode blocks the current turn until the command completes or times out, and the TUI streams stdout and stderr into the running `Bash` tool card while the command is still active. By default, a foreground command that hits its timeout is not killed — it keeps running as a background task (bounded by the 600s default background timeout, i.e. a command auto-backgrounded on timeout gets a fresh 600-second budget); to restore kill-on-timeout, set [`bash_auto_background_on_timeout`](../configuration/config-files.md#background) to `false` under `[background]`. The 600s background default is configurable via [`bash_task_timeout_s`](../configuration/config-files.md#background) (`0` = no timeout) and defaults to no timeout in print mode (`kiki -p`). Background mode returns a task ID immediately and automatically notifies the Agent when the task finishes. stdin is always closed — interactive commands receive EOF immediately. A two-phase termination strategy (SIGTERM → 5-second grace period → SIGKILL) ensures reliable process cleanup when a task is stopped or hits its background timeout. On Windows, Git Bash is used by default.
55
+ **Foreground** mode blocks the current turn until the command completes or times out, and the TUI streams stdout and stderr into the running `Bash` tool card while the command is still active. **Background** mode returns a task ID immediately and automatically notifies the Agent when the task finishes.
56
+
57
+ A foreground command that hits its timeout is not killed by default: it keeps running as a background task, with a fresh copy of the 600s background budget. Set [`bash_auto_background_on_timeout`](../configuration/config-files.md#background) to `false` under `[background]` to kill timed-out foreground commands instead, and change the background budget itself with [`bash_task_timeout_s`](../configuration/config-files.md#background) (`0` = no timeout; print mode defaults to no timeout).
58
+
59
+ stdin is always closed, so an interactive command receives EOF immediately. A stopped or timed-out task is terminated with SIGTERM, then SIGKILL after the 5-second grace period. On Windows, Git Bash is used by default.
52
60
 
53
61
  ## Dynamic tools
54
62
 
@@ -60,23 +68,33 @@ If no deferred MCP or plugin tools are active, neither `SelectTools` nor `CallTo
60
68
 
61
69
  `HistorySearch`, `HistoryRead`, and `HistoryList` are resident built-in tools in the `history` group. When enabled, they are included directly in the tool list and can be called without `SelectTools`. They read transcript history under the existing workspace access policy; a source `ref` identifies evidence, not a permission grant.
62
70
 
63
- **Migration from the earlier Search default:** `HistorySearch({"query":"distinctive words"})` now searches the current session and current agent with `mode: "auto"` (complete phrase matching). It previously defaulted to workspace-wide token-AND search. Existing windows holding the older tool description use the new default as well; tool execution is not pinned to the schema version the model saw. Every Search result echoes `scope_used`, `mode_used`, and `target`. When a session-scoped page has fewer hits than its limit, `expand_hint.next_call` shows a ready-to-use `scope: "workspace"` retry; for auto/all/any it explicitly selects indexed `mode: "terms"` (token-AND), so the response echoes that changed matching mode. To preserve the old search deliberately, pass `{"scope":"workspace","mode":"terms"}`; `scope: "this_session"` remains a locked-current-session alias. Choose another `session_id` explicitly for a known older session, and name an `agent_id` or `include_subagents` when expanding the agent range. Check `coverage` and `next_cursor`: a partial empty page means the scanned or indexed domain is incomplete. A scan cursor resumes a bounded segment; if it expires, restart the original query.
71
+ `HistorySearch({"query":"distinctive words"})` searches the current session and current agent with `mode: "auto"` (complete phrase matching). Every result echoes `scope_used`, `mode_used`, and `target` — read them instead of assuming a default. To search the way earlier Kiki versions did, pass `{"scope":"workspace","mode":"terms"}`; `scope: "this_session"` remains a locked-current-session alias, and another `session_id` selects a known older session.
72
+
73
+ When a session-scoped page has fewer hits than its limit, `expand_hint.next_call` gives you a ready-to-use `scope: "workspace"` retry; for `auto` / `all` / `any` it explicitly switches to indexed `mode: "terms"` (token-AND), and the response echoes that changed matching mode. Name an `agent_id` or set `include_subagents` to widen the agent range. Check `coverage` and `next_cursor`: a partial empty page means the scanned or indexed domain is incomplete. A scan cursor resumes a bounded segment, and if it has expired, restart the original query.
64
74
 
65
75
  For server transcript fallback, `sort: "newest"` and `"oldest"` order matching text by timestamp, with stable source-ID ties across pages; missing timestamps sort as zero. Navigation first prepares the current visibility through a fixed source watermark, so a cold large session may return empty `navigation_building` preparation pages before any hits. Continue with `next_cursor`; preparation and text reads share the same per-call budget. Once navigation is ready, newest-first search reads recent text spans directly rather than scanning the wire prefix.
66
76
 
67
- The default `sort: "relevance"` ranks lexical match scores only among the hits collected on the current bounded page: full-query matches and additional matching clauses raise the score, then newer timestamps and stable IDs break ties. Pages are scanned newest-first, not globally ordered by relevance; a later page may contain a stronger match. Partial pages disclose `page_local_relevance` in coverage. New scan cursors bind the request, source fingerprint, and navigation generation; appending, undoing, clearing, or rewriting the source invalidates them. Restart the query after an invalidation. Older scan cursors can still continue source-order scans and carry a warning to restart for sorted navigation.
77
+ The default `sort: "relevance"` ranks lexical match scores only among the hits collected on the current bounded page: full-query matches and additional matching clauses raise the score, then newer timestamps and stable IDs break ties. Pages are scanned newest-first, not globally ordered by relevance; a later page may contain a stronger match. Partial pages disclose `page_local_relevance` in coverage.
78
+
79
+ A new scan cursor pins the historical range this query started over. Normal appends to the source still allow paging, but the newly added content is not in this result set — re-run the query to see it. If the pinned source content changes, the query conditions change, or the shared navigation advances past this range, restart the query as the response instructs. Older scan cursors continue to read under their original compatibility rules.
80
+
81
+ `HistorySearch` returns `source_changed` when it finds the source changing while a read is running; restart the query once its writer settles. That is distinct from a cursor you passed that no longer matches its source or query, which asks you to restart without it.
68
82
 
69
83
  Calls that omit the newer scope and mode arguments use the current session and `auto` matching. Read `scope_used` and `mode_used` in the response rather than assuming a historical default; when the result is too narrow, follow `expand_hint.next_call` and retry with `scope: "workspace"`.
70
84
 
71
- Use `HistoryList` to browse short turn excerpts or archived agents when you lack search words. A turn entry's `ref` opens the whole turn as source blocks with `HistoryRead`; `turn` and `step_id` also select bounded turn/step blocks. While the navigation directory is still being built, coverage reports the scanned portion. Use `HistoryRead({"step_id":"t42.3"})` for a known step. For a Search hit on a text block, `HistoryRead({"ref":"<hit.ref>"})` starts near the match. Each block includes its own `ref` and UTF-16 `range`; continue with `cursor`, or reopen a block with its `ref` and `start_char` set to the previous `range.end` if the cursor expires. A stale or removed source returns an error instead of another turn's content. Existing v1 Read cursors continue their legacy JSON paging; restart with a ref, turn, or step_id for blocks.
85
+ Use `HistoryList` to browse short turn excerpts or archived agents when you lack search words. A turn entry's `ref` opens the whole turn as source blocks with `HistoryRead`; `turn` and `step_id` also select bounded turn/step blocks. While the navigation directory is still being built, the response is a `partial` preparation page that reports the scanned portion and carries a cursor — continue with it instead of assuming the list is complete. Use `HistoryRead({"step_id":"t42.3"})` for a known step. For a Search hit on a text block, `HistoryRead({"ref":"<hit.ref>"})` starts near the match. Each block includes its own `ref` and UTF-16 `range`; continue with `cursor`, or reopen a block with its `ref` and `start_char` set to the previous `range.end` if the cursor expires. A stale or removed source returns an error instead of another turn's content. Existing v1 Read cursors continue their legacy JSON paging; restart with a ref, turn, or step_id for blocks.
86
+
87
+ `HistoryRead` reports a normal `partial` read with the blocks it scanned and a cursor to continue. `no_match` means the scan finished and the selector has nothing there. `source_pending` means the persisted transcript ends in an unfinished record, so the lookup cannot yet say whether the selector matches; retry it once the writer settles. When the navigation directory is still being prepared, the same `partial` status comes back with a preparation cursor and progress, and an empty block list there means not scanned yet, not absent — continue with that cursor before reading it as `no_match`. If the agent's persisted transcript is unavailable altogether, the error points you at `HistoryList` with `kind: "agents"` to check the agent id. A source that has changed returns an error rather than another turn's content.
72
88
 
73
- To search only cross-thread messages, use `HistorySearch({"query":"handoff","scope":"peer"})`. This searches both directions within the current workspace, or the explicitly approved `workspace_id`; optional `session_id` narrows to one session. Peer search reuses the lexical matching modes but is newest-first: omit `sort` or use `"newest"`. It excludes subagents and ordinary user input, does not accept `source: "transcript"`, and accepts only `agent_id: "main"` when an agent is specified. The response has `source: "mailbox"`; hits carry `communication` metadata with message identity, endpoints, and delivery state, without fabricated transcript turn numbers or HistoryRead refs. Use the [communication-history REST read](../server/rest-api.md#communication-history) for the full message and navigation identity. Continue a partial or empty page using `next_cursor`; the view covers retained mailbox records, not older messages already evicted by previous versions.
89
+ To search only cross-thread messages, use `HistorySearch({"query":"handoff","scope":"peer"})`. It searches both directions within the current workspace, or the explicitly approved `workspace_id`; an optional `session_id` narrows to one session. Peer search reuses the lexical matching modes but is newest-first, so omit `sort` or use `"newest"`. It excludes subagents and ordinary user input, does not accept `source: "transcript"`, and accepts only `agent_id: "main"`.
90
+
91
+ The response has `source: "mailbox"`; hits carry `communication` metadata with message identity, endpoints, and delivery state. Use the [communication-history REST read](../server/rest-api.md#communication-history) for the full message and navigation identity. Continue a partial or empty page using `next_cursor`; the view covers retained mailbox records, not older messages already evicted by previous versions.
74
92
 
75
93
  In non-interactive prompt runs (`kiki -p`), `HistoryList` reads a bounded prefix of the persisted transcript without starting a server or search worker: at most 2 MiB, 10,000 records and 256 KiB per record; agent rosters inspect at most 256 directory entries. Results explicitly report `partial` coverage and do not contain navigation `ref` values. You can list the current session or specify another persisted `session_id`. `HistorySearch` and `HistoryRead` remain unavailable in this print host; use an interactive session or the server for indexed search and full history reads.
76
94
 
77
95
  ## Web Tools
78
96
 
79
- Both web tools are backed by Kiki's built-in search and retrieval module, which ships with the product — there is nothing to install. A keyless repository-search lane and the URL fetch chain work without configuration; for broader web search, choose another lane. See [`nb_search`](../configuration/config-files.md#nb-search) for configuration.
97
+ Both web tools are backed by Kiki's built-in search and retrieval module, which ships with the product — there is nothing to install. General-web search and URL fetching work without configuration or an API key. See [`nb_search`](../configuration/config-files.md#nb-search) for configuration.
80
98
 
81
99
  | Tool | Default Approval | Description |
82
100
  | --- | --- | --- |
@@ -87,7 +105,7 @@ Both web tools are backed by Kiki's built-in search and retrieval module, which
87
105
 
88
106
  Search the web through Kiki's built-in search and retrieval module (`nb-search`). The minimal call is `{ "query": "search terms" }`, which selects `action: "run"` and lets everything else fall back to your `[nb_search]` defaults. `query` may be a single string or an array of strings.
89
107
 
90
- Without configuration, this call uses `github.repositories`: results cover GitHub repositories, not the general web. Choose `context7.docs` for library documentation (a typed result), or explicitly select `duckduckgo.search` for keyless general-web results; the public HTML endpoint may issue a CAPTCHA. A configured provider such as `exa.search` is preferable when reliable broad coverage matters. If the default lane is explicitly removed, the tool still fails closed unless a `lane`, `lanes`, or `preset` is named. Explicit selections override the default and never silently switch providers when invalid or unavailable.
108
+ Without configuration, this call uses `duckduckgo.search` for general-web results, with no registration, API key or lane selection. The public HTML endpoint may issue a challenge or rate limit; wait before retrying, or explicitly choose another configured source. These failures are errors, not empty results. Choose `github.repositories` for repository search or `context7.docs` for library documentation (a typed result). If the default lane is explicitly removed, the tool still fails closed unless a `lane`, `lanes`, or `preset` is named. Explicit selections override the default and never silently switch providers when invalid or unavailable.
91
109
 
92
110
  `run` accepts these parameter groups that actually change behavior:
93
111
 
@@ -192,7 +210,7 @@ The parent Agent's `Bash` calls still follow the current permission rules. Enter
192
210
 
193
211
  `notes` accepts only the changed sections: `goal`, `directives`, `decided`, `rejected`, `evidence`, `files`, `next`, and `open`. Each supplied string replaces its entire section, so include its still-valid conditions and exceptions. Omitted sections remain unchanged; `""` deletes one section, `notes: null` clears all notes, and `notes: {}` changes no content. Each section is limited to 1,500 characters and the whole notebook to 7,500; an over-limit mixed call changes neither domain. Writes return a compact receipt with changed and cleared fields, revision, character counts, and todo status counts, not the full notebook. Use `{}` when you need the current contents.
194
212
 
195
- Main and child agents have separate lists and notes; the tool cannot read or update another agent's state. Both are restored with their owning agent and follow conversation undo. Context renewal preserves existing notes; a summary's candidate instructions are kept for review rather than written automatically. `review_handoff: true` explicitly acknowledges that the handoff and human input have been checked against current notes and original sources, through the current tool call. An ordinary section update does not acknowledge that review. Oversized candidates remain complete in the handoff with a visible notice, and unreviewed input is carried forward. In the GUI, unknown text sections retain their field names; unreadable updates show a warning and the last readable notes rather than an empty notebook. Historical shared lists remain with the main agent; earlier child lists are not reconstructed from tool messages.
213
+ Main and child agents have separate lists and notes; the tool cannot read or update another agent's state. Both are restored with their owning agent and follow conversation undo, and context renewal preserves existing notes. `review_handoff: true` explicitly acknowledges that the handoff and human input have been checked against current notes and original sources; an ordinary section update does not acknowledge that review. Oversized candidates stay complete in the handoff with a visible notice, and unreviewed input is carried forward. Historical shared lists remain with the main agent.
196
214
 
197
215
  The task board is the persistent record of requirements that survives sessions. `BoardRead` supports `preview`, `list`, `show`, and `overview` for cards in the current workspace or other authorized workspaces. `BoardWrite` `create` always starts at `active`, so do not pass `status`; for `update`, include `status` only when changing the state. Valid states are `active`, `in_progress`, `paused`, `done`, `cancelled`, and `superseded`. `done`, `cancelled`, and `superseded` are terminal; reopen a terminal card by setting `status` back to `active`, `in_progress`, or `paused`, which clears its `completedAt`. Updates must use the card's current `revision`; after a conflict, reread the card before retrying.
198
216
 
@@ -206,7 +224,43 @@ Memory stores what a session does not keep. Agents save durable facts with `Memo
206
224
 
207
225
  When a proposed update or archive is held for review, the original entry keeps its current content and stays in effect until you decide. Accepting the proposal applies the update or archive to that original entry; discarding it removes only the proposal and leaves the original untouched. If the original entry has changed since the proposal was made, the decision is refused, the proposal is kept, and you are asked to read the entry again.
208
226
 
209
- For the three-scope model, the review inbox, the undoable change history, and the `/memory` page, see [Memory](../guides/memory.md).
227
+ ### Writing an entry
228
+
229
+ `MemoryWrite` takes one `action` per call:
230
+
231
+ - **`create`** — a genuinely new subject. Requires `type`, `title`, `body` and `reason`; omits `id` and `expected_revision`. Without an explicit `scope` it lands in the bound persona, otherwise the workspace.
232
+ - **`update`** — revise the entry in place, keeping its id and the conditions that still hold. `body` is the complete new content, not a patch.
233
+ - **`supersede`** — write a replacement with its own id and retire the predecessor only once the replacement is active. This is the right choice for a rule that genuinely changed, and it keeps both versions readable.
234
+ - **`archive`** — retire an entry, preserving its stored content. Send only the target and `reason`; the type, title and body fields are ignored.
235
+
236
+ `update`, `supersede` and `archive` need `id` **and** `expected_revision` — the revision from a read result, a search item, or an earlier receipt. Without it the call is refused rather than applied to a version you have not seen. The same id can exist in more than one visible scope; an explicit `scope` limits the lookup, and an omitted one must resolve to exactly one target or the call reports the candidates instead of choosing.
237
+
238
+ Two optional fields record what the content is resting on, and both are omitted or preserved rather than defaulted:
239
+
240
+ - **`basis`** — `{ kind, note, refs? }` where `kind` is `human`, `observed`, `derived` or `unknown`. It records the evidence for the content, separately from the writer that the system records automatically; a write that runs in your turn is not automatically attributed to you. Omitting it on an `update` keeps the current basis only if the type, title and body are unchanged. Rewrite any of those without supplying a new basis and the entry is downgraded to `{ kind: 'unknown' }` with a `content changed without refreshed attribution` warning, so a stale attribution cannot survive the text it described.
241
+ - **`validity`** — `{ check, until? }`, for content that changes. Omitting it on an `update` keeps the existing value; sending `null` clears it deliberately. A missing `validity` does not mean the content is permanently true.
242
+
243
+ `covered_by` applies to `archive` only, and takes `{ id, expected_revision }` of a retained active entry in the same scope whose content fully covers the target's. The dependency is re-checked inside the write when the retirement is applied, so retiring an entry against a replacement that has since changed fails with `covered_target_changed` instead of losing the rule.
244
+
245
+ A successful call returns the full stored (or proposed) entry together with an `outcome`:
246
+
247
+ | Outcome | What it means |
248
+ | --- | --- |
249
+ | `applied` | The write took effect. The returned entry is the current read — do not re-read it just to confirm. |
250
+ | `pending` | The write is a proposal awaiting your decision. The entry it targets is unchanged and still in effect. |
251
+ | `unchanged` | Nothing in the submitted write differed from what is stored. No new revision and nothing to undo were created. |
252
+
253
+ `operation_id` is `null` for `unchanged`, and for a repeated identical pending request, which is how a duplicate proposal is recognized rather than stacked.
254
+
255
+ Failures come back as structured errors with a `code`, a message and recovery guidance — `missing_revision`, `revision_conflict`, `not_found`, `ambiguous_target`, `scope_mismatch`, `covered_target_changed`, `duplicate_title` and others. The intended response is to follow the recovery, re-read if needed, and make one corrected attempt; creating a second entry to get around a refused write is what these codes exist to prevent. A target you cannot see is reported as unavailable rather than written on someone else's behalf.
256
+
257
+ ### Searching and reading
258
+
259
+ `MemorySearch` takes `mode: "search"` (the default, requires `query`) or `mode: "list"` (no query, browses the inventory). `page_size` is 1–20 and defaults to 8 for search and 20 for list; continue with `cursor` alone, and changing any filter invalidates it. Each item carries the full title, type, status, revision, owning scope, a `target` whose fields can be copied straight into `MemoryWrite`, `basis_kind` and an `applicability` of `expired`, `recheck` or `unrecorded`. The response's `coverage` states which scopes and statuses were inspected and whether anything was skipped. Continue empty preparation pages while `exhausted` is false; scan budgets do not cut off the remaining source. Search ranking is local to each bounded source chunk. Search also returns a `snippet` of at most 200 characters and a `score`; list returns neither. A snippet omits conditions, so read before you rely on, merge, or replace an entry.
260
+
261
+ `MemoryRead` takes exactly one of `id` or `ids` (up to 10), reads active, archived and replaced entries by default, and includes pending proposals only with `include_pending: true`. The result is the complete entry — not a summary — with its owning scope, target fields and applicability, so a read can be the source for an `update`.
262
+
263
+ For the three-scope model, the review inbox, the undoable change history, and the `/memory` page, see [Memory](../guides/memory.md). For the same data over HTTP, see [Server API](../server/rest-api.md#memory).
210
264
 
211
265
  ## Collaboration Tools
212
266
 
@@ -214,7 +268,7 @@ Main agents receive five thread tools by default: `ThreadCreate`, `ThreadList`,
214
268
 
215
269
  Omitting `host_id`, leaving it empty, or using `"local"` addresses the executing agent's home, not the space currently open in the GUI. Same-home communication can cross workspaces. Another local or remote space requires an owner-approved one-way [thread bridge](./command.md#kiki-bridges); use its returned host-qualified reference and `bridge_id` or `connection_id`. Identical session IDs in different homes remain different threads. GUI browsing permission does not grant bridge permission.
216
270
 
217
- - `ThreadCreate` is for an explicit user request to create a new thread or session, not for routine delegation. Optional `cwd` must be an absolute path to an existing directory, including a directory outside the current workspace; omitted `cwd` uses the current session's workspace root. Optional `profile` must name an enabled main-agent profile; omitted `profile` uses the default. Optional `prompt` (at most 100,000 characters) becomes the new thread's first user message and starts its turn immediately; without it, the thread stays empty until the user sends a message. Optional `title` overrides the default: if omitted with a prompt, the first line (up to 80 characters) becomes the title; without a prompt, the session uses its default name. The result returns `id`, `title`, `cwd`, `profile`, and `prompt_started`. The new thread appears in the left session list within a few seconds; use `ThreadSend` and `ThreadWait` to continue interacting with it.
271
+ - `ThreadCreate` is for an explicit user request to create a new thread or session, not for routine delegation. Optional `cwd` must be an absolute path to an existing directory, including one outside the current workspace; omitted `cwd` uses the current session's workspace root. Optional `profile` must name an enabled main-agent profile; omitted `profile` uses the default. Optional `prompt` (at most 100,000 characters) becomes the new thread's first user message and starts its turn immediately; without it, the thread stays empty until the user sends a message. Optional `title` overrides the default: with a prompt and no title, the first line (up to 80 characters) becomes the title. The result returns `id`, `title`, `cwd`, `profile`, and `prompt_started`; the thread then appears in the left session list within a few seconds, and `ThreadSend` and `ThreadWait` continue the conversation.
218
272
  - `ThreadList` lists enabled, unarchived sessions, optionally filtered by `workspace_id`. With no bridge selector it lists the executing home; with a selector it lists only the approved target scope and requires `read`. Local results are newest first. `limit` defaults to 50 and accepts 1–100; use the returned opaque cursor for another page.
219
273
  - `ThreadRead` reads completed main-agent turns locally without resuming a cold session. Across a bridge it requires `read` and returns a bounded `view.transcript` page with coverage and cursors; omitted text or frames carry `contentRefs`. Pass a returned reference as `content_ref` to read its next bounded `view.segment`. `limit` defaults to 20 and accepts 1–100.
220
274
  - `ThreadSend` durably saves an explicit message and records the executing main-agent session as its verified source. Supply the target, non-empty `content` of at most 100,000 characters, and `idempotency_key` of at most 256 characters. There is no source parameter; reuse a key only for the same message. A bridge needs `send`, plus `wake` to deliver into a model prompt or resume a cold thread; without wake it stays pending. `delivered` confirms prompt delivery, not a reply. Pending records retry with the original key for up to 15 minutes; use bridge receipts to inspect rejection reasons. Ordinary assistant text is never forwarded automatically.
@@ -227,7 +281,7 @@ Only `ThreadSend`, called by the source thread's main Agent, records peer attrib
227
281
 
228
282
  On Kiki desktop and the `kiki` CLI/TUI, the main `agent` profile always receives `AgentRun`, `AgentList`, and `AgentSend`. These tools address only the caller's direct children — by the optional `name` passed to `AgentRun`, or by agent id. They are not behind an experiment. The built-in [`coder` and `explore` profiles](../customization/agents.md) do not receive them.
229
283
 
230
- `AgentList` returns those direct children and never lists grandchildren. `AgentSend` queues a mailbox message that is delivered as early as possible: when the child is running, the message is steered into its active turn at the next step boundary; when the child is idle (or a race just ended its turn), it stays queued and is read at the beginning of the child's next step.
284
+ `AgentList` returns those direct children and never lists grandchildren. `AgentSend` queues a mailbox message for a direct child, and what happens to it depends on the child's state — the `AgentSend` entry further down this page has the detail.
231
285
  Collaboration tools handle inter-Agent coordination, user interaction, and Skill invocation.
232
286
 
233
287
  | Tool | Default Approval | Description |
@@ -238,7 +292,30 @@ Collaboration tools handle inter-Agent coordination, user interaction, and Skill
238
292
  | `AskUserQuestion` | Auto-allow | Ask the user a question to gather structured input |
239
293
  | `Skill` | Auto-allow | Invoke a registered inline Skill |
240
294
 
241
- **`AgentRun`** delegates a subtask to a sub-Agent. Required parameters are `prompt` and `description` (a short 3-5 word task description for UI display). Optional launch parameters include `profile` (when omitted, an explicitly configured `[subagent].default_profile` selects that profile; with no such key, the built-in general-purpose subagent prompt is used; an explicit blank value requires a target), `profile_file` (an explicit role Markdown file, absolute or workspace-relative; it is not a shared prompt template and is mutually exclusive with `profile`, `route`, and `resume`), `background` (omitted: background for main, foreground for subagents; explicit `false` waits synchronously), `name` (a session-unique handle of lowercase letters, digits, and underscores; `root` is reserved), `route`, `model_alias`, `effort`, and `allow_model_change` for an explicit model change on `resume`. Two optional parameters override this child's tools for one binding: `tools` replaces the resolved tool selection (a lone `*`, or `["*", ThreadRead]`, keeps the ordinary tools and adds that opt-in, while a finite list stays finite), and `disallowed_tools` adds a call-level deny. Omit both and a new child uses the configured default while a `resume` keeps its saved overrides; an explicit value replaces that layer, and `disallowed_tools: []` clears only the call-level deny, never a profile, ancestor, or route deny. Both need the native executor: an external executor that does not support them fails before the child starts. A new spawn selects its model in order: concrete `model_alias` parameter → effective profile, route, or caller-lease pin → explicitly configured `[subagent].default_model`. With none of these sources it fails with `model.not_configured` and no child is created. The caller's model and main-agent `default_model` are not silent fallbacks. `AgentRun` rejects `model_alias: "inherit"`: specify a concrete configured model name, or omit the parameter to use the target default. A subagent profile, route, or caller lease may still set `model_alias: inherit` to bind the caller's current resolved model and effective thinking effort unless tool `effort` or an applicable profile, route, lease, or matching `model_profiles` effort pin takes priority. Otherwise, effort resolves through tool `effort` → matching `model_profiles` effort → profile `thinking_effort` when the bound model matches its pin → the bound model's own default. An unknown concrete `model_alias` is an error; a main-agent profile cannot use `inherit` because it has no caller. `resume` continues an existing direct child by name or agent id, is mutually exclusive with `name`, `profile`, `profile_file`, and `route`. Omit both `model_alias` and `effort` to keep the saved binding, or pass `effort` to apply it on the next idle run. `AgentRun` also rejects `model_alias: "inherit"` on resume; use a concrete model name for an explicit change. Omit `model_alias` to keep the saved model; changing it to a different canonical model requires `allow_model_change: true`, while an alias resolving to the same canonical model is a no-op. `preferred_models`, `discouraged_models`, `preferred_efforts`, and route/caller-lease pins produce advisories for hard-permitted executable bindings. `allowed_models`, `deny_models`, and `allowed_efforts` are hard in profile, lease, tree, and matching model-profile scopes; binding, manual changes, and resume reject violations. Machine deny, unavailable capabilities, model-change confirmation, and executor/thread restrictions also remain hard. An external executor that does not support changing a resumed thread binding returns an error instead of recreating the thread or executor. Agent tasks time out after 2 hours by default; configure the global limit through `[subagent] timeout_ms` or `KIKI_SUBAGENT_TIMEOUT_MS` (`0` disables it), and print mode defaults to no timeout. There is no per-call timeout or arbitrary provider-parameter passthrough. In foreground mode the parent waits; in background mode a task ID returns immediately and the result is delivered automatically through a later synthetic User message. The TUI groups several foreground calls from one step and shows their status and elapsed time. See [Agents and Sub-Agents](../customization/agents.md) for the complete profile and lifecycle contract.
295
+ **`AgentRun`** delegates a subtask to a sub-Agent. Required parameters are `prompt` and `description` (a short 3-5 word task description for UI display).
296
+
297
+ | Parameter | Effect |
298
+ | --- | --- |
299
+ | `profile` | Which agent profile runs the subtask. Omitted, an explicitly configured `[subagent].default_profile` selects it; with no such key, the built-in general-purpose subagent prompt is used; an explicit blank value requires a target |
300
+ | `profile_file` | A role Markdown file, absolute or workspace-relative. It is a role definition rather than a shared prompt template, and is mutually exclusive with `profile`, `route`, and `resume` |
301
+ | `background` | Omitted: background for a main-agent call, foreground for a subagent call. An explicit `false` waits synchronously |
302
+ | `name` | A session-unique handle of lowercase letters, digits, and underscores; `root` is reserved |
303
+ | `route` | A profile route to run instead of a named profile |
304
+ | `model_alias` | The model the child uses. See [model selection](./model-vocabulary.md#binding-rules) for the full resolution order |
305
+ | `effort` | Thinking effort for this child |
306
+ | `allow_model_change` | Required on `resume` to switch an existing child to a different model |
307
+ | `tools` | Replaces the resolved tool selection for this binding only. A lone `*`, or `["*", ThreadRead]`, keeps the ordinary tools and adds that opt-in; a finite list stays finite |
308
+ | `disallowed_tools` | Adds a call-level deny. `[]` clears only that layer, never a profile, ancestor, or route deny |
309
+
310
+ Omit both `tools` and `disallowed_tools` and a new child uses the configured default, while a `resume` keeps its saved overrides. Both parameters need the native executor; an external executor that does not support them fails before the child starts.
311
+
312
+ **Model and effort.** A new spawn picks its model in this order: the `model_alias` parameter → the pin on the effective profile, route, or caller lease → an explicitly configured `[subagent].default_model`. With none of these sources the call fails with `model.not_configured` and no child is created — the caller's model and the main-agent `default_model` are not silent fallbacks. `AgentRun` rejects `model_alias: "inherit"`, so pass a concrete configured model name or omit the parameter; a subagent profile, route, or caller lease can still set `model_alias: inherit` to follow the caller. Thinking effort otherwise resolves through the tool `effort` → the route's locked effort, or the caller lease's when the route pins none → a matching `model_profiles` effort → the profile's `thinking_effort` when the bound model matches its pin → the bound model's own default. With no declared effort, a model known not to support thinking uses `off`; a thinking model without a resolvable default still requires an explicit effort. Unknown capabilities do not imply `off`. See the [full binding rules](../customization/agents.md#named-profile-routes-experimental).
313
+
314
+ `preferred_models`, `discouraged_models`, and `preferred_efforts` are recommendations, so a model outside them still runs. `allowed_models`, `deny_models`, and `allowed_efforts` are hard: binding, manual changes, and resume all reject a violation, as do machine-level deny rules and unavailable capabilities.
315
+
316
+ **Resume.** `resume` continues an existing direct child by name or agent id, and is mutually exclusive with `name`, `profile`, `profile_file`, and `route`. Omit both `model_alias` and `effort` to keep the saved binding, or pass `effort` to apply it on the next idle run. `model_alias: "inherit"` is rejected here too — use a concrete model name to change models, and add `allow_model_change: true` when the change resolves to a different model. An external executor that cannot change a resumed thread's binding returns an error rather than recreating the thread.
317
+
318
+ **Timeouts and modes.** Agent tasks time out after 2 hours by default; set the global limit with `[subagent] timeout_ms` or `KIKI_SUBAGENT_TIMEOUT_MS` (`0` disables it), and print mode defaults to no timeout. There is no per-call timeout. In foreground mode the parent waits; in background mode a task ID returns immediately and the result arrives later as a synthetic User message. The TUI groups several foreground calls from one step and shows their status and elapsed time. See [Agents and Sub-Agents](../customization/agents.md) for the complete profile and lifecycle contract.
242
319
 
243
320
  The `AgentRun` default follows the caller's runtime identity, not the target profile, and applies again on `resume`; goal mode does not change it. Main calls with omitted `background` or explicit `true` require `TaskList`, `TaskOutput`, and `TaskStop`; if they are unavailable, launch fails with guidance to enable them or retry with explicit `background:false`. No synchronous fallback is attempted. For a main foreground call, steer / Send now releases the wait into background without stopping the child. The next safe step reads the new input, and the child still delivers its completion notification. Ordinary queued input does not detach the wait. Stopping the current main turn is not the same as stopping detached children; use `TaskStop` to stop a tracked child explicitly.
244
321
 
@@ -248,9 +325,9 @@ A completion still reaches you automatically while a [goal](../guides/goals.md)
248
325
 
249
326
  **`AgentList`** lists direct children of the current agent. Optional `include_finished` defaults to false. A live child that is starting, running, or cancelling stays visible as `running`, even after its previous background task has completed or timed out. A broken live executor is `errored`; otherwise status follows the latest background task, or is `untracked` when there is no task record. Pass `true` to also include finished or errored children. At most 50 entries are returned, running first; `omitted` is the count that did not fit. Each entry includes `agent_id`, optional `name` and `profile`, and `status`. A `running` child does not necessarily have a tracked background task or a pending completion notification; use `TaskList` to inspect tracked work.
250
327
 
251
- **`AgentSend`** queues a non-empty `message` for a direct child identified by `target` (a `name` from `AgentRun`, or an agent id). A running child receives the message as soon as possible: it is steered into the child's active turn at the next step boundary. An idle resumable child starts a new run with the message, and that run's completion notifies the parent like any other agent task. If more than one direct child matches, or none do, the call fails — use `AgentList` and retry with an unambiguous value. A full mailbox means the child has too many unread queued messages; wait until it consumes some, then retry.
328
+ **`AgentSend`** queues a non-empty `message` for a direct child identified by `target` (a `name` from `AgentRun`, or an agent id). A child that is running natively receives the message at the next step boundary, steered into its active turn. A child running on an external executor is not steerable, so the message waits and is picked up when its next run starts. An idle resumable child starts a new run with the message, and that run's completion notifies the parent like any other agent task. If more than one direct child matches, or none do, the call fails — use `AgentList` and retry with an unambiguous value. A full mailbox means the child has too many unread queued messages; wait until it consumes some, then retry.
252
329
 
253
- The result includes a `message_id` and a `queued` or `delivered` status. `queued` means accepted by the mailbox, not yet added to the recipient's context. Once the recipient's context is persisted and the mailbox acknowledges delivery, the sender's transcript records a delivery receipt and clears the GUI's pending-delivery label, even if the child's transcript is not open. The receipt survives reload and history replay; it confirms delivery, not that the child has acted on the message.
330
+ The result includes a `message_id` and a `queued` or `delivered` status. `queued` means the mailbox accepted the message; delivery can complete concurrently, so it does not say the message is definitely still unread. `delivered` means the message reached the recipient's context and nothing more — not that the child has acted on it. `resumed: true` reports that a new run was actually observed starting; the field is omitted when no run start was observed, so its absence is not a negative answer. Once the recipient's context is persisted and the mailbox acknowledges delivery, the sender's transcript records a delivery receipt and clears the GUI's pending-delivery label, even if the child's transcript is not open. The receipt survives reload and history replay.
254
331
 
255
332
  **`AskUserQuestion`** asks the user a structured multiple-choice question — useful for disambiguation or option selection. The `questions` parameter accepts 1–4 questions; each question requires `question` (ending with `?`), `options` (2–4 choices, each with a `label` and `description`), and optional `header` (max 12 characters) and `multi_select` (defaults to false). An "Other" option is appended automatically. Setting `background` to true starts a background question task and returns a task ID immediately. When the host does not support interactive questioning, a failure message is returned and the Agent should ask the user directly in a text reply instead.
256
333
 
@@ -6,7 +6,7 @@ outline: 2
6
6
 
7
7
  This page documents the changes in each Kiki release.
8
8
 
9
- ::: info Note
9
+ ::: tip Note
10
10
  Early entries on this page originate from the upstream Kimi Code project and use the naming of their time. The command's current name is `kiki`; for environment variables, the exact names in [Environment variables](../configuration/env-vars.md) are authoritative.
11
11
  :::
12
12
 
@@ -15,7 +15,6 @@ Early entries on this page originate from the upstream Kimi Code project and use
15
15
  ### Polish
16
16
 
17
17
  - web: Settings gains a Lab tab with a new multi-tab sidebar toggle; when enabled, the sidebar shows the Open / Done / Workspaces tabs.
18
- - Make several refinements and internal improvements. See the [changelog on GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md) for more technical entries.
19
18
 
20
19
  ## 0.37.1 (2026-08-18)
21
20
 
@@ -47,7 +46,6 @@ Early entries on this page originate from the upstream Kimi Code project and use
47
46
  - web: Fix Ctrl+K in the composer opening session search on macOS — session search now only answers to Cmd+K.
48
47
  - web: Fix the Background Agent panel showing incorrect task counts and statuses.
49
48
  - web: Fix pasting a copied folder into the composer failing the upload with a connection error — folders are now skipped instead.
50
- - Fix several known issues and make various refinements. See the [changelog on GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md) for more technical entries.
51
49
 
52
50
  ## 0.36.1 (2026-08-14)
53
51
 
@@ -59,10 +57,6 @@ Early entries on this page originate from the upstream Kimi Code project and use
59
57
 
60
58
  - web: Polish the Plan, Goal, and Swarm toggles in the composer, which now live in the + menu next to the input box.
61
59
 
62
- ### Bug Fixes
63
-
64
- - Fix several known issues and make various refinements. See the [changelog on GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md) for more technical entries.
65
-
66
60
  ## 0.36.0 (2026-08-13)
67
61
 
68
62
  ### Features
@@ -93,7 +87,6 @@ Early entries on this page originate from the upstream Kimi Code project and use
93
87
  - Show project MCP launch targets in the workspace trust prompt, default to declining trust, and resolve `fd` and `stty` binaries to absolute paths so untrusted workspaces cannot plant bare-name executables before confirmation.
94
88
  - Fix sessions failing with a provider 400 error on every follow-up request after a turn is interrupted while the model is still thinking, on strict OpenAI-compatible providers (e.g. DeepSeek).
95
89
  - Fix Ctrl+C being ignored during automatic retries of failed API requests.
96
- - Fix several known issues and make various refinements. See the [changelog on GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md) for more technical entries.
97
90
 
98
91
  ## 0.35.0 (2026-08-12)
99
92
 
@@ -107,7 +100,6 @@ Early entries on this page originate from the upstream Kimi Code project and use
107
100
  - Fix coder subagents spawning further subagents by default.
108
101
  - Fix the token counts reported after compaction reading far below the real context size; they now match the numbers shown while the session runs.
109
102
  - Fix two binary-planting risks on Windows.
110
- - Fix several known issues and make various refinements. See the [changelog on GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md) for more technical entries.
111
103
 
112
104
  ## 0.34.0 (2026-08-06)
113
105
 
@@ -28,7 +28,7 @@ The table below lists the capabilities declared by the current ACP adapter layer
28
28
 
29
29
  ## ACP Method Coverage
30
30
 
31
- The spec divides methods into a **stable** surface and an evolving **unstable** surface. The two have entirely different stability guarantees — the stable surface covers methods every production ACP client uses, while the unstable surface covers experimental extensions (inline-edit prediction, document buffer sync, provider management, elicitation, etc.) — so they are listed separately. All methods needed for a normal agent flow (initialize → auth → new/load/resume → prompt → cancel + file I/O + tool approval) are implemented.
31
+ The spec splits methods into a **stable** surface and an evolving **unstable** surface, so they are listed separately. Everything a normal agent flow needs — initialize → auth → new/load/resume → prompt → cancel, plus file I/O and tool approval — is implemented.
32
32
 
33
33
  ### Stable agent-side — IDE → agent
34
34
 
@@ -92,7 +92,7 @@ Paseo's generic ACP adapter does not drive the login flow, so complete the termi
92
92
 
93
93
  - **Session disconnects immediately / IDE shows "agent exited"**: usually a wrong `command` path or a missing login. Run `kiki acp` in a terminal first to verify — if it blocks waiting for stdin, the CLI itself is fine and the problem is in the IDE configuration; if it exits immediately with an error, follow the error message (most commonly you need to run `/login`).
94
94
  - **IDE shows "auth required"**: the CLI has no usable authentication token. Exit the IDE, run `kiki` in a terminal to complete login, then restart the IDE.
95
- - **MCP tools not visible**: check the [`kiki acp` reference](./acp.md) capability table to confirm that the MCP transport type configured in your IDE is supported. The Kiki ACP adapter currently supports `http`, `stdio`, and `sse` transports; `acp` transport MCP servers are silently dropped and a warning is written to the log.
95
+ - **MCP tools not visible**: the `kiki acp` adapter accepts `http` and `sse` transports, and `stdio` only when the IDE is started with `--allow-client-stdio-mcp`. An `acp`-transport server is discarded with a warning in the log. See [MCP Forwarding](./acp.md#mcp-forwarding).
96
96
 
97
97
  ## Next steps
98
98
 
@@ -18,7 +18,7 @@ kiki serve --ensure --workspace . --json
18
18
  kiki serve --stop
19
19
  ```
20
20
 
21
- With no mode, `serve` runs the daemon in the foreground. `--query --json` only inspects the current instance; `--ensure` attaches to an existing healthy instance or starts one; `--stop` shuts down the reachable instance for the selected home. A live instance with unverifiable identity must be stopped or upgraded before Kiki will start another. `--idle-exit` defaults to `30m`; active client leases (periodically renewed indications that a client is still using the daemon) and running dispatches keep it alive. Explicit `--idle-exit 0ms` keeps a newly started daemon running until explicitly stopped. The TUI performs the same attach-or-start behavior after workspace trust.
21
+ With no mode, `serve` runs the daemon in the foreground. `--query --json` only inspects the current instance; `--ensure` attaches to an existing healthy instance or starts one; `--stop` shuts down the reachable instance for the selected home. If a live instance's identity cannot be verified, stop or upgrade it before Kiki will start another. `--idle-exit` defaults to `30m`; active client leases (periodically renewed indications that a client is still using the daemon) and running dispatches keep it alive. Explicit `--idle-exit 0ms` keeps a newly started daemon running until you stop it. The TUI attaches or starts the same way after workspace trust.
22
22
 
23
23
  ## Run the compatible foreground server
24
24
 
@@ -50,14 +50,14 @@ For a trusted local client, carry the local-owner capability as follows:
50
50
 
51
51
  - **REST**: the `Authorization: Bearer <token>` request header.
52
52
  - **Kiki GUI**: the URL in the startup banner carries a `#token=` fragment, so opening it in a browser completes sign-in automatically. The fragment is never sent to the server.
53
- - **WebSocket**: clients that can set headers use `Authorization: Bearer`; clients that cannot (such as browsers) pass the subprotocol (a protocol name declared during the WebSocket handshake) `kimi-code.bearer.<token>` (a historical protocol name kept from the upstream Kimi Code era for compatibility).
53
+ - **WebSocket**: clients that can set headers use `Authorization: Bearer`; clients that cannot (such as browsers) pass the token in the handshake subprotocol as `kimi-code.bearer.<token>`.
54
54
 
55
- If the remote owner token leaks, run `kiki web rotate-token`: it replaces `server.token`, invalidates the old remote credential and stops affected peer streams without a restart. This does not rotate `server.local-owner`; treat exposure of that local administrative capability as a compromise of local access, not as something fixed by remote-token rotation.
55
+ If the remote owner token leaks, run `kiki web rotate-token`: it replaces `server.token`, invalidates the old remote credential and stops affected peer streams without a restart. It does not rotate `server.local-owner`, so treat exposure of that file as a compromise of local access.
56
56
 
57
57
  The desktop GUI first checks the instance registry and attaches to an existing server with its local-owner capability; only when none is found does it start its own sidecar. Supported local clients in the same home therefore share the same sessions, regardless of which launcher started the server.
58
58
 
59
59
  ::: warning Note
60
- This warning targets independently provisioned, mutually untrusted runtimes (for example, two services with distinct host identities and separate authority domains): do not point such runtimes at the same writable home, do not copy session directories between their homes, and do not copy `device_id` to make two homes impersonate the same host — session indexes, thread attribution, and permission boundaries all rely on the uniqueness of a home identity. The shared daemon, TUI, desktop GUI, and coexisting server instances within one home are supported ways of collaborating and are unaffected.
60
+ Two independently provisioned runtimes that do not trust each other — separate services with their own host identity and authority domain — must not share a writable `KIKI_HOME`, must not copy session directories between their homes, and must not copy `device_id` to impersonate the same host. Session indexes, thread attribution, and permission boundaries all depend on a home having a unique identity. The shared daemon, TUI, desktop GUI, and coexisting server instances inside one home are supported and unaffected.
61
61
  :::
62
62
 
63
63
  Binding a non-loopback address (`--host`, including bare `--host`, which targets `0.0.0.0`) requires either a TLS-terminating reverse proxy in front of the server or `--insecure-no-tls`; without one of those the server refuses to start. Once it is running on a non-loopback address, you may set `KIKI_PASSWORD` as an additional owner credential; it does not replace the local-owner capability or the per-source grant. The server rate-limits authentication failures automatically.
@@ -84,7 +84,7 @@ kiki web --insecure-no-tls # allow plain LAN HTTP (see the warning below)
84
84
 
85
85
  In the TUI the same operations are `/web temporary|persistent|status|off|link|revoke [id]`, with `--host`, `--port`, `--public-url`, `--insecure-no-tls`, and `--no-open`.
86
86
 
87
- Each run prints a single-use link that signs a browser in. Kiki redeems it for a session cookie held by the browser itself (HttpOnly, `SameSite=Strict`, host-only, `Secure` over HTTPS); no session or root token is ever placed in JavaScript, `localStorage`, or a URL query string. The link is shown once — the server keeps only a digest, so a lost link is replaced by a new one rather than looked up. An already-authorized browser keeps working across service restarts; a new device needs a new link.
87
+ Each run prints a single-use link that signs a browser in. Kiki redeems it for a session cookie held by the browser itself (HttpOnly, `SameSite=Strict`, host-only, `Secure` over HTTPS); no session or root token is ever placed in JavaScript, `localStorage`, or a URL query string. The server keeps only a digest, so a lost link is replaced by a new one rather than looked up. An already-authorized browser keeps working across service restarts; a new device needs a new link.
88
88
 
89
89
  Turning Web access off revokes every link and every browser session, and closes the open streams. It does not stop the daemon, the desktop app, or the TUI, and it does not cancel work already started. `kiki serve` and the desktop app are unaffected either way.
90
90
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open protocol that lets models safely call tools exposed by external processes or services — for example, reading GitHub issues, querying databases, or operating the local file system. Kiki acts as an MCP client to connect these external tools and exposes them to the Agent alongside built-in tools (`Read`, `Bash`, `Grep`, etc.) with no behavioral difference.
4
4
 
5
- MCP tool results can carry embedded media. When the current model cannot take an embedded image — because of its format or because the part is over the per-part size cap — the result keeps a text notice *and* saves the original into the session's media storage, so nothing is lost. The notice carries the saved file's absolute path and a `kimi-file://` reference; pass the path to `Read` or `ReadMediaFile` to inspect the original. A resource blob in a format Kiki does not deliver is preserved the same way. When the accumulated list of saved attachments would crowd the tool output, it is written to a text file and the output keeps a short pointer to it.
5
+ MCP tool results can carry embedded media. When the current model cannot take an embedded image — because of its format or because the part is over the per-part size cap — Kiki keeps a text notice *and* saves the original into the session's media storage, so nothing is lost. The notice carries the saved file's absolute path and a `kimi-file://` reference; pass the path to `Read` or `ReadMediaFile` to inspect the original. A resource blob in a format Kiki does not deliver is preserved the same way. When the list of saved attachments would crowd the tool output, it is written to a text file and the output keeps a short pointer to it.
6
6
 
7
7
  ## Connection Methods
8
8
 
@@ -67,7 +67,7 @@ Optional fields:
67
67
 
68
68
  You do not have to set the connection timeout or the single tool-call timeout per server: `[mcp] startup_timeout_ms` / `[mcp] tool_timeout_ms` in `config.toml` or the `KIKI_MCP_STARTUP_TIMEOUT_MS` / `KIKI_MCP_TOOL_TIMEOUT_MS` environment variables change the global defaults. Precedence is: per-server field > environment variable > `config.toml` > built-in default. See [Configuration files](../configuration/config-files.md#mcp).
69
69
 
70
- HTTP and SSE servers support providing static credentials via `headers` or `bearerTokenEnvVar`. When OAuth is needed, run `/kiki-ops help me log in to MCP <server-name>` to complete browser-based authorization.
70
+ HTTP and SSE servers support providing static credentials via `headers` or `bearerTokenEnvVar`. When OAuth is needed, run `/kiki-ops help me log in to MCP <server-name>` to complete browser-based authorization. If the server's authorization metadata says it supports `offline_access`, Kiki asks for that scope during login so the authorization can be refreshed later without a new sign-in; otherwise your original scopes are used as they are. A server that advertises the scope may still show an extra consent page, and does not guarantee it issues a refresh token. An already-signed-in server keeps its existing grant and goes on refreshing it — a new scope does not sign you out.
71
71
 
72
72
  Plugins can also declare MCP servers in their manifest. Servers declared by a plugin are enabled by default and can be disabled or re-enabled in `/plugins`: disabling or removing stops the tools in open sessions — calls fail with a removal notice — while re-enabling reconnects the server in open sessions immediately and restores its tools, as long as the server already existed when the session was created (this includes re-enabling an `enabled: false` entry in `mcp.json`). A brand-new server still follows the rule above: it only joins sessions created later. See [Plugins](../customization/plugins.md#mcp-servers-in-plugins) for details.
73
73