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.
- package/README.md +13 -10
- package/dist/docs/en/configuration/config-files.md +63 -20
- package/dist/docs/en/configuration/data-locations.md +12 -4
- package/dist/docs/en/configuration/env-vars.md +4 -6
- package/dist/docs/en/configuration/overrides.md +13 -14
- package/dist/docs/en/configuration/providers.md +8 -6
- package/dist/docs/en/customization/agent-profiles.md +33 -38
- package/dist/docs/en/customization/agents.md +129 -107
- package/dist/docs/en/customization/hooks.md +41 -48
- package/dist/docs/en/customization/personas.md +19 -21
- package/dist/docs/en/customization/plugins.md +180 -156
- package/dist/docs/en/customization/prompt-fields.md +10 -6
- package/dist/docs/en/customization/skills.md +11 -13
- package/dist/docs/en/customization/skins.md +23 -27
- package/dist/docs/en/customization/themes.md +15 -15
- package/dist/docs/en/features/agents.md +85 -0
- package/dist/docs/en/features/daily.md +37 -7
- package/dist/docs/en/features/ecosystem.md +3 -1
- package/dist/docs/en/features/extend.md +7 -1
- package/dist/docs/en/features/freedom.md +4 -0
- package/dist/docs/en/features/index.md +6 -5
- package/dist/docs/en/features/long-work.md +23 -5
- package/dist/docs/en/features/look.md +1 -1
- package/dist/docs/en/features/people.md +10 -2
- package/dist/docs/en/features/spaces.md +16 -4
- package/dist/docs/en/features/workbench.md +11 -3
- package/dist/docs/en/getting-started/desktop-app.md +44 -29
- package/dist/docs/en/getting-started/first-launch.md +32 -21
- package/dist/docs/en/getting-started/installation.md +27 -12
- package/dist/docs/en/getting-started/use-cases.md +35 -35
- package/dist/docs/en/guides/goals.md +9 -7
- package/dist/docs/en/guides/interaction.md +26 -26
- package/dist/docs/en/guides/interface.md +18 -14
- package/dist/docs/en/guides/memory.md +43 -14
- package/dist/docs/en/guides/sessions.md +32 -26
- package/dist/docs/en/guides/settings.md +60 -29
- package/dist/docs/en/index.md +8 -2
- package/dist/docs/en/reference/command.md +8 -4
- package/dist/docs/en/reference/keyboard.md +18 -4
- package/dist/docs/en/reference/model-vocabulary.md +6 -8
- package/dist/docs/en/reference/slash-commands.md +4 -4
- package/dist/docs/en/reference/tools.md +92 -15
- package/dist/docs/en/release-notes/changelog.md +1 -9
- package/dist/docs/en/server/acp.md +1 -1
- package/dist/docs/en/server/ide.md +1 -1
- package/dist/docs/en/server/local-server.md +5 -5
- package/dist/docs/en/server/mcp.md +2 -2
- package/dist/docs/en/server/rest-api.md +79 -5
- package/dist/docs/en/server/sdk.md +2 -2
- package/dist/docs/zh/configuration/config-files.md +56 -15
- package/dist/docs/zh/configuration/data-locations.md +12 -4
- package/dist/docs/zh/configuration/env-vars.md +4 -6
- package/dist/docs/zh/configuration/overrides.md +13 -14
- package/dist/docs/zh/configuration/providers.md +7 -5
- package/dist/docs/zh/customization/agent-profiles.md +31 -36
- package/dist/docs/zh/customization/agents.md +120 -98
- package/dist/docs/zh/customization/hooks.md +35 -42
- package/dist/docs/zh/customization/personas.md +16 -18
- package/dist/docs/zh/customization/plugins.md +167 -142
- package/dist/docs/zh/customization/prompt-fields.md +9 -5
- package/dist/docs/zh/customization/skills.md +10 -12
- package/dist/docs/zh/customization/skins.md +19 -23
- package/dist/docs/zh/customization/themes.md +12 -12
- package/dist/docs/zh/features/agents.md +85 -0
- package/dist/docs/zh/features/daily.md +37 -7
- package/dist/docs/zh/features/ecosystem.md +3 -1
- package/dist/docs/zh/features/extend.md +7 -1
- package/dist/docs/zh/features/freedom.md +4 -0
- package/dist/docs/zh/features/index.md +6 -5
- package/dist/docs/zh/features/long-work.md +22 -4
- package/dist/docs/zh/features/look.md +1 -1
- package/dist/docs/zh/features/people.md +10 -2
- package/dist/docs/zh/features/spaces.md +15 -3
- package/dist/docs/zh/features/workbench.md +11 -3
- package/dist/docs/zh/getting-started/desktop-app.md +43 -28
- package/dist/docs/zh/getting-started/first-launch.md +32 -21
- package/dist/docs/zh/getting-started/installation.md +26 -11
- package/dist/docs/zh/getting-started/use-cases.md +35 -37
- package/dist/docs/zh/guides/goals.md +8 -8
- package/dist/docs/zh/guides/interaction.md +25 -25
- package/dist/docs/zh/guides/interface.md +18 -14
- package/dist/docs/zh/guides/memory.md +43 -14
- package/dist/docs/zh/guides/sessions.md +30 -24
- package/dist/docs/zh/guides/settings.md +54 -23
- package/dist/docs/zh/index.md +7 -1
- package/dist/docs/zh/reference/command.md +7 -3
- package/dist/docs/zh/reference/keyboard.md +18 -4
- package/dist/docs/zh/reference/model-vocabulary.md +6 -8
- package/dist/docs/zh/reference/slash-commands.md +3 -3
- package/dist/docs/zh/reference/tools.md +74 -9
- package/dist/docs/zh/release-notes/changelog.md +1 -9
- package/dist/docs/zh/server/acp.md +1 -1
- package/dist/docs/zh/server/ide.md +1 -1
- package/dist/docs/zh/server/local-server.md +5 -5
- package/dist/docs/zh/server/mcp.md +2 -2
- package/dist/docs/zh/server/rest-api.md +69 -1
- package/dist/docs/zh/server/sdk.md +2 -2
- package/dist/main.mjs +12545 -3456
- package/dist/web/assets/AppErrorBoundary-RFIAb-Uf.js +1 -0
- package/dist/web/assets/NavScopeBoundary-DY_ET7A-.js +1 -0
- package/dist/web/assets/{arc-y2SkSoyr.js → arc-CMgTB1m7.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-uCwLz53m.js → architectureDiagram-3BPJPVTR-BU79ou2C.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-BZyWv36G.js → blockDiagram-GPEHLZMM-Bkuldod2.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-DKGx9i50.js → c4Diagram-AAUBKEIU-C3WMeqyu.js} +1 -1
- package/dist/web/assets/channel-DpDZUJRn.js +1 -0
- package/dist/web/assets/{chunk-2J33WTMH-CSkrhrsp.js → chunk-2J33WTMH-CesyWmwo.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-CtxMoJ68.js → chunk-4BX2VUAB-C7rghYTf.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-Dos3ftEy.js → chunk-55IACEB6-BqRHhwtz.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-wbzEYK9z.js → chunk-727SXJPM-BhSqCRBc.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-B9GKvCD6.js → chunk-AQP2D5EJ-DdYE2ZVZ.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-u5Y2P6IX.js → chunk-FMBD7UC4-BCRPUxDF.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-B8rFKkTV.js → chunk-ND2GUHAM-CuvyDjTR.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-EQsKtuD-.js → chunk-QZHKN3VN-BU5vAS78.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-Bju1GfNu.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-Bju1GfNu.js +1 -0
- package/dist/web/assets/client-C0oH7-8r.js +2 -0
- package/dist/web/assets/connection-BhO2nh7P.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-D6dr5mIW.js → cose-bilkent-S5V4N54A-CXrvsA1a.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-Dnyhc4Hn.js → dagre-BM42HDAG-TaAea3Rt.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CYXkWdne.js → diagram-2AECGRRQ-CdEH4jGt.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-DPwBf5Ag.js → diagram-5GNKFQAL-A0jZ_p-T.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-DNeLYZ8X.js → diagram-KO2AKTUF-miHWORz3.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-zU8RsQTX.js → diagram-LMA3HP47-BlUIwEIg.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-Cf9Mm94H.js → diagram-OG6HWLK6-DwDzMhEg.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-Ch4CeiUI.js → erDiagram-TEJ5UH35-BJr5w62i.js} +1 -1
- package/dist/web/assets/export-BlxaZKEe.js +2 -0
- package/dist/web/assets/{flowDiagram-I6XJVG4X-Csn6WqEH.js → flowDiagram-I6XJVG4X-BP7KSFjx.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-DsuBgEyu.js → ganttDiagram-6RSMTGT7-BstLBBof.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-CPA7jCxU.js → gitGraphDiagram-PVQCEYII-C57s7nZ-.js} +1 -1
- package/dist/web/assets/highlighted-body-OFNGDK62-BVb-7KsA.js +1 -0
- package/dist/web/assets/index-69qhvTvD.js +1 -0
- package/dist/web/assets/{index-BYUHmd8w.js → index-BDNM6yJI.js} +2 -2
- package/dist/web/assets/{index-BGgZxlEQ.js → index-BJF_gEDs.js} +2 -2
- package/dist/web/assets/index-BOwMP6BP.js +1 -0
- package/dist/web/assets/{index-C69a5Mcz.js → index-BZsyXCqm.js} +1 -1
- package/dist/web/assets/{index-C7EA7a_g.js → index-Bfl4JiNq.js} +2 -2
- package/dist/web/assets/index-BlD3AKX-.js +1 -0
- package/dist/web/assets/{index-CIymCfcP.js → index-BnvW0EvQ.js} +1 -1
- package/dist/web/assets/index-C4rmWyOm.js +1 -0
- package/dist/web/assets/index-CGLcb3HY.js +1 -0
- package/dist/web/assets/{index-kWBxPqIX.js → index-CPvOeQPX.js} +1 -1
- package/dist/web/assets/index-Cjbe0JKM.js +1 -0
- package/dist/web/assets/index-CmYoJWUm.js +1 -0
- package/dist/web/assets/index-CtUFrjKe.js +1 -0
- package/dist/web/assets/index-DDvDRMTK.js +1 -0
- package/dist/web/assets/index-DSpndwAR.css +1 -0
- package/dist/web/assets/index-D_JjTHxi.js +1 -0
- package/dist/web/assets/index-DbuwcnbT.js +1 -0
- package/dist/web/assets/index-DcXyS0nN.js +1 -0
- package/dist/web/assets/index-Dcl9ruKA.js +1 -0
- package/dist/web/assets/index-DgwALPNA.js +121 -0
- package/dist/web/assets/{index-DoN1FTEe.js → index-DkE8hRT1.js} +2 -2
- package/dist/web/assets/index-DsyRBZ4h.js +1 -0
- package/dist/web/assets/{index-29zav3JI.js → index-DuudNhLL.js} +4 -4
- package/dist/web/assets/index-Gc4F0b2f.js +1 -0
- package/dist/web/assets/index-HGqqwKoV.js +13 -0
- package/dist/web/assets/index-KchrJnno.js +3 -0
- package/dist/web/assets/{index-B0KNSyji.js → index-Tmi2BPYU.js} +1 -1
- package/dist/web/assets/index-Ya4GuDs0.js +1 -0
- package/dist/web/assets/index-_aDaKqLB.js +1 -0
- package/dist/web/assets/index-_qwOAotB.js +1 -0
- package/dist/web/assets/index-hnIkczza.js +7 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-D3Q__m62.js → infoDiagram-5YYISTIA-CifuVY6C.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-CcvCBuZ5.js → ishikawaDiagram-YF4QCWOH-Cd60vQUi.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-COZU4LNt.js → journeyDiagram-JHISSGLW-Cb3Xl_wl.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-BrXjBoAU.js → kanban-definition-UN3LZRKU-Ei6ThuZt.js} +1 -1
- package/dist/web/assets/{linear-BgP1STFi.js → linear-CDZJx-o2.js} +1 -1
- package/dist/web/assets/mermaid-GHXKKRXX-DFxyxD7G.js +331 -0
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-CgjSrE5r.js → mindmap-definition-RKZ34NQL-B0ygxzkx.js} +1 -1
- package/dist/web/assets/navViewState-Ck_HK-TK.js +1 -0
- package/dist/web/assets/{pieDiagram-4H26LBE5-DTfe1sKA.js → pieDiagram-4H26LBE5-B2FdrvDv.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-D95hfh0q.js → quadrantDiagram-W4KKPZXB-CwpOTy3d.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-DtSLi7Mh.js → requirementDiagram-4Y6WPE33-ExdZNzLQ.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-gi_dJpcU.js → sankeyDiagram-5OEKKPKP-u0EZKD7D.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DKQ9a72t.js → sequenceDiagram-3UESZ5HK-BXHMy5DY.js} +1 -1
- package/dist/web/assets/{spaces-B2Ccyh_T.js → spaces-C8n7xQPx.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-Bz7tmSqa.js → stateDiagram-AJRCARHV-DMXx7ell.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Bydq1_By.js +1 -0
- package/dist/web/assets/theme-BBnHttAf.js +1 -0
- package/dist/web/assets/{timeline-definition-PNZ67QCA-BfMXPwhV.js → timeline-definition-PNZ67QCA-DtqVG_4u.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-WLxW2KT5.js → vennDiagram-CIIHVFJN-Dom0ex8r.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-DiiqwIdq.js → wardley-L42UT6IY-C-RstmuQ.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DmCukWuw.js → wardleyDiagram-YWT4CUSO-C8CzNfdf.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-Cfq1W2tT.js → xychartDiagram-2RQKCTM6-1AxVTyB6.js} +1 -1
- package/dist/web/index.html +2 -2
- package/native/auth-native/prebuilds/linux-arm64/auth-native.node +0 -0
- package/native/auth-native/prebuilds/linux-x64/auth-native.node +0 -0
- package/native/auth-native/prebuilds/win32-arm64/auth-native.node +0 -0
- package/native/auth-native/prebuilds/win32-x64/auth-native.node +0 -0
- package/package.json +1 -1
- package/dist/web/assets/AppErrorBoundary-DWpgwxFV.js +0 -1
- package/dist/web/assets/NavScopeBoundary-D8Lf1G0U.js +0 -1
- package/dist/web/assets/channel-BGdXootG.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CPcnLy_H.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CPcnLy_H.js +0 -1
- package/dist/web/assets/client-DSIbyfoz.js +0 -2
- package/dist/web/assets/connection-DYZn9oPZ.js +0 -1
- package/dist/web/assets/export-Bq8ZECqX.js +0 -2
- package/dist/web/assets/highlighted-body-OFNGDK62-CDPBxM_E.js +0 -1
- package/dist/web/assets/index-AksnytJj.js +0 -1
- package/dist/web/assets/index-B8xhhYDh.css +0 -1
- package/dist/web/assets/index-BUrlrKap.js +0 -1
- package/dist/web/assets/index-B_5-HLed.js +0 -62
- package/dist/web/assets/index-BfmoxdpP.js +0 -1
- package/dist/web/assets/index-Bo3e-ohM.js +0 -3
- package/dist/web/assets/index-BrYV9gV_.js +0 -1
- package/dist/web/assets/index-C8XUtAvK.js +0 -1
- package/dist/web/assets/index-C9uil5my.js +0 -13
- package/dist/web/assets/index-CKpWHSp9.js +0 -1
- package/dist/web/assets/index-CLKBgQxV.js +0 -1
- package/dist/web/assets/index-CTyyUNWj.js +0 -7
- package/dist/web/assets/index-D7cg9qYZ.js +0 -1
- package/dist/web/assets/index-D7dg8R_q.js +0 -1
- package/dist/web/assets/index-DCSpedV_.js +0 -1
- package/dist/web/assets/index-DLbD0Nx5.js +0 -1
- package/dist/web/assets/index-DaEzbvvu.js +0 -1
- package/dist/web/assets/index-DhbcjMZF.js +0 -1
- package/dist/web/assets/index-Dw2h88mF.js +0 -1
- package/dist/web/assets/index-FcMtfmKv.js +0 -1
- package/dist/web/assets/index-XFq9Kgg0.js +0 -1
- package/dist/web/assets/index-iI2mM43w.js +0 -1
- package/dist/web/assets/index-oXOF7lko.js +0 -1
- package/dist/web/assets/locale-CANfezJ4.js +0 -17
- package/dist/web/assets/mermaid-GHXKKRXX-_JLagMll.js +0 -321
- package/dist/web/assets/navViewState-DS5LnMYc.js +0 -1
- package/dist/web/assets/settings-CcwMWXbp.js +0 -42
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-D6-wdUbw.js +0 -1
- package/dist/web/assets/theme-DlDhDxeD.js +0 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# `kiki` Command
|
|
2
2
|
|
|
3
|
-
`kiki` is the
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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` |
|
|
64
|
-
| `Ctrl-B` |
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 [
|
|
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
|
-
:::
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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"})`.
|
|
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.
|
|
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 `
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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).
|
|
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
|
|
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
|
|
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
|
-
:::
|
|
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
|
|
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**:
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
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 —
|
|
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
|
|