## Thinking Path > - Paperclip manages agents that must write work and report task outcomes through its API. > - Local adapters select an execution engine and its permission settings. > - A higher ACP Node requirement can make an unchanged installation lose access to its default engine. > - The adapter then silently selects CLI, which can change permissions and block API access. > - This pull request keeps the engine choice fixed and reports missing prerequisites before work starts. > - It also gives explicit Codex CLI runs usable defaults and keeps managed services on a supported Node runtime. ## Linked Issues or Issue Description Refs #12215. Related changes: #11792 raised the Node requirement; #13094 addressed separate runner networking behavior. This change fixes the engine-selection and managed-launcher paths. **What happened?** An unchanged agent could switch from ACP to CLI after an upgrade. Codex CLI then used read-only permissions with networking disabled. The run could finish without updating its task. Repeated recovery attempts used the same unavailable setup. Managed updates also skipped the Node check and did not refresh old launchers. **Expected behavior** An unavailable engine must fail with a clear setup error. It must not silently select another engine. Explicit CLI runs must be able to write workspace files and call the API unless the operator configures stricter settings. Managed updates must validate Node and keep child tools on that runtime. **Steps to reproduce** 1. Run an ACP-default agent under Node 22 after the ACP minimum rises to 24.11. 2. Leave the engine unset and disable the approval/sandbox bypass. 3. Observe the old adapter select CLI and fail to write task disposition through the API. 4. Start a managed service with an old launcher and a supervisor PATH that selects a different Node for child tools. ## What Changed - Remove automatic engine fallback for Codex, Claude, Gemini, and Kimi. Check prerequisites for default and explicit ACP selections. - Return a configuration error with proof that provider work did not start. Stop automatic continuation retries for this error. - Enable Codex ACP workspace networking at the actual turn boundary. Upstream mode presets otherwise force it off even when config.toml enables it. Preserve explicit network denial and read-only mode. - Set workspace-write and network access defaults for explicit Codex CLI runs. Preserve explicit sandbox modes, profiles, and network restrictions. - Pin the validated Node directory in managed launcher PATH. Refresh legacy launchers during installs and npm/Git updates. - Reject updates on unsupported Node. Keep update checks, dry runs, and rollback available. - Synchronize the qualified Codex ACP executable identity across server, TypeScript runner, Rust runner, and provider-pack launch paths. - Add regression tests and update engine and installation documentation. ## Verification - [Full CI passed on the final head](https://github.com/paperclipai/paperclip/actions/runs/34387099695): typecheck, build/native runner verification, all general and serialized test shards, all browser shards, release registry, canary dry run, and policy checks. - Greptile: 5/5 on `2c1d6e2815830a5cd39e36c8a082cc0c4441b6c0`, with no unresolved review findings. Security gates are green. - Full workspace typecheck and build also passed locally. The final deployed Linux build passed. - Full Codex, Claude, Gemini, and Kimi source test suites: 804 passed, 2 skipped. Installer, updater, and launcher tests: 47 passed. Installed ACP turn-boundary tests: 3 passed. ACP packaging tests: 14 passed. Focused recovery classification tests also passed. - Real Linux Codex CLI runs, both fresh and resumed, wrote a workspace file and reached the control-plane health API with the new defaults. - Explicit read-only and network-disabled control probes retained those restrictions. - A real ACP run on the final deployed Linux build wrote a file and reached the control-plane API with HTTP 200, without engine fallback. The same probe failed DNS before the turn-policy patch. - Executable-identity and installed-policy contracts: 12 passed. Affected native server tests: 197 passed. Runner factory tests: 21 passed. Rust qualification and native provider integration tests: 11 passed. - Deployed the production changes to a Linux service on Node 24.20 after a verified database backup. Health, bootstrap readiness, static UI, executable/cwd identity, and guarded restart checks passed. The restart lost no runs. - Corrected stale Kimi skill-default and Gemini remote-archive fixtures; both suites pass. ## Risks - Default or legacy auto engine settings now fail when ACP is unavailable. Operators who intend to use CLI must select it explicitly. - Codex CLI now permits workspace writes and networking by default, and ACP workspace-write turns permit networking by default. Explicit operator sandbox settings remain authoritative. - Old managed launchers keep their pinned Node until they are reinstalled under a supported runtime. An old updater cannot repair itself; the documentation gives the current installer command. - Custom service wrappers and global/source installations must configure their runtime PATH. No database migration is required. ## Model Used OpenAI Codex, based on GPT-6, with reasoning, repository inspection, shell execution, and test tools. The exact serving model identifier and context-window size are not exposed in this session. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
7.9 KiB
title, summary
| title | summary |
|---|---|
| Kimi Code CLI | Kimi Code CLI local adapter setup and configuration |
The kimi_local adapter runs the Kimi Code CLI (kimi) locally. It has two execution engines: the default ACP engine (kimi acp, streaming transcript with live tool status, matching claude_local/gemini_local) and a CLI lane (kimi -p --output-format stream-json) selected explicitly with engine: cli. It supports session persistence, per-run skill delivery via --skills-dir, thinking-effort control, and structured output parsing.
Prerequisites
- Kimi Code CLI installed (
kimicommand available; npm package@moonshot-ai/kimi-code) - Authentication configured via one of:
kimi login(OAuth device flow; credentials stored under$KIMI_CODE_HOME, default~/.kimi-code/)- A provider configured in Kimi's
config.toml([providers.<name>]) - The
KIMI_MODEL_NAME+KIMI_MODEL_API_KEYenvironment pair (optionallyKIMI_MODEL_BASE_URL,KIMI_MODEL_PROVIDER_TYPE), set in the adapter env or server shell
Configuration Fields
| Field | Type | Required | Description |
|---|---|---|---|
engine |
string | No | Execution engine: acp (default; streaming ACP lane via kimi acp), cli (headless kimi -p lane), or unset/auto (ACP; unavailable prerequisites fail the run). |
cwd |
string | Yes | Working directory for the agent process (absolute path; created automatically if missing when permissions allow) |
model |
string | No | Kimi model alias (provider/model). Defaults to kimi-code/kimi-for-coding. When empty, Kimi uses default_model from its own config.toml. |
promptTemplate |
string | No | Prompt used for all runs |
instructionsFilePath |
string | No | Markdown instructions file prepended to the prompt. Sibling files in the same directory (HEARTBEAT.md, SOUL.md, TOOLS.md) are made readable via --add-dir on local runs. |
effort |
string | No | Thinking effort (low | medium | high | max). CLI lane only: forwarded as KIMI_MODEL_THINKING_EFFORT for effort-capable models (currently kimi-code/k3); medium maps to high since Kimi has no medium tier. Ignored for models without support_efforts, and not forwarded on the default ACP engine lane — pin engine: cli when effort control matters. |
command |
string | No | CLI command override. Defaults to kimi. |
extraArgs |
string[] | No | Additional CLI arguments appended to every run |
env |
object | No | Environment variables (supports secret refs) |
timeoutSec |
number | No | Process timeout (0 = no timeout) |
graceSec |
number | No | Grace period before force-kill |
Execution Engine
By default the adapter runs Kimi through the ACP engine (kimi acp, an Agent Client Protocol server over stdio), the same shared engine used by claude_local, codex_local, and gemini_local. ACP streams the transcript live: assistant text arrives as deltas and tool calls report a pending/completed status, so the issue thread updates continuously instead of in bursts.
Engine selection (engine config field):
- unset or
auto: use ACP when its prerequisites pass (Node >= 20, resolvablekimi acpcommand, a bidirectional process target), otherwise fail with an actionable setup error. acp: require ACP; startup failures surface as run errors rather than falling back.cli: pin the headless CLI lane described below.
The ACP lane reuses the shared acpx session codec, transcript parser, and CLI event formatter, so sessions, transcripts, and logs render identically to the other ACP adapters.
Headless Execution (CLI lane)
Runs execute as kimi -p <prompt> --output-format stream-json (plus -m <model> when configured and -r <sessionId> when resuming). On local runs the adapter also passes --add-dir <instructions-dir> so the agent can read sibling instruction files, and --skills-dir <dir> when skills are desired (see below). The prompt is passed as an argument, not stdin. The adapter sets a headless-safe environment (CI=1, NO_COLOR=1, KIMI_CODE_NO_AUTO_UPDATE=1, and TERM=dumb when unset) so unattended heartbeats never block on interactive prompts, theme detection, or update preflight; user-configured env values always win.
Instructions Bundle
When instructionsFilePath points at a managed instruction bundle, the entry file (e.g. AGENTS.md) is prepended to the prompt along with a directive that names its sibling files (HEARTBEAT.md, SOUL.md, TOOLS.md). On local runs the containing directory is exposed to Kimi via --add-dir, so the agent can actually open those companion files instead of only seeing the entry file.
Thinking Effort
The effort field applies to the headless CLI lane only (engine: cli). On the default ACP engine lane it is currently not forwarded: Kimi's ACP interface exposes a separate thinking config option that Paperclip does not wire yet, so an effort configured on an ACP-lane agent leaves Kimi's own default behavior in place. Pin engine: cli when thinking-effort control matters. On the CLI lane, effort is forwarded as the KIMI_MODEL_THINKING_EFFORT operational override, which applies to Kimi providers including managed OAuth models. Kimi has no per-invocation effort flag and no medium tier, so medium is mapped to high; low, high, and max pass through. Effort is only sent for models that advertise support_efforts (currently kimi-code/k3) to avoid provider rejections; extend EFFORT_CAPABLE_MODELS in the adapter as more models gain support.
Session Persistence
The adapter captures the Kimi session id from the trailing session.resume_hint meta event and persists it between heartbeats. On the next wake, it resumes the existing conversation with -r <session_id> so the agent retains context.
Session resume is cwd-aware: if the working directory changed since the last run, a fresh session starts instead.
If resume fails with an unknown/unrecoverable session error, the adapter automatically retries with a fresh session.
Skills Delivery
Desired Paperclip skills are delivered from a dedicated per-run directory passed via --skills-dir, so skills load reliably and in isolation without writing into the shared ~/.kimi-code/skills home. On remote runs the skills snapshot is synced to the target and --skills-dir points at that isolated copy — Paperclip never overwrites $KIMI_CODE_HOME/skills, so skills installed by the operator or other agents are left intact. --skills-dir is only passed when at least one skill is desired, so unconfigured agents keep Kimi's default skill discovery.
Control-plane skill
paperclipai agent local-cli <agentRef> -C <companyId> installs the Paperclip control-plane skills into ~/.kimi-code/skills (honoring KIMI_CODE_HOME), alongside the existing ~/.codex/skills and ~/.claude/skills targets. Kimi auto-discovers this home on every run, so the agent has the control-plane API reference (issue/comment/interaction routes) from turn one rather than rediscovering endpoints by trial and error. Pass --no-install-skills to skip. This is independent of the per-run --skills-dir delivery above, which only applies when an agent has explicitly configured skills.
Environment Test
Use the "Test Environment" button in the UI to validate the adapter config. It checks:
- Kimi CLI is installed and accessible (
kimi --version) - Working directory is absolute and available (auto-created if missing and permitted)
- Auth availability (OAuth credential/config files under
$KIMI_CODE_HOME, or theKIMI_MODEL_NAME+KIMI_MODEL_API_KEYenv pair) - A live hello probe (
kimi -p "Respond with hello." --output-format stream-json) to verify CLI readiness
Notes
- Both execution engines are supported: the ACP engine (
kimi acp, default) and the headless CLI lane (engine=cli). - Available model aliases on a standard install:
kimi-code/kimi-for-coding(K2.7 Coding),kimi-code/kimi-for-coding-highspeed(K2.7 Coding Highspeed),kimi-code/k3(K3).