Kimi-Code Limitations: 8 Critical Constraints Developers Must Know

Kimi-Code limitations include synthetic browser events that fail on trusted-event checks, no cross-origin iframe access, single-process session ownership, and a 100 MiB PDF generation cap.

The Kimi-Code repository is a sophisticated, monorepo-based AI-coding agent developed by MoonshotAI. While powerful, its architectural design imposes practical boundaries that affect browser automation, IDE integration, and concurrent usage. Understanding these Kimi-Code limitations helps developers avoid failures and implement proper workarounds.


Web Browser Automation Limitations

The WebBridge skill enables browser automation through a local daemon that communicates via the Chrome DevTools Protocol. However, this design introduces significant constraints.

Synthetic Events Cannot Pass Trusted-Event Checks

The WebBridge daemon generates click and fill tools that produce synthetic DOM events with event.isTrusted === false. Websites requiring trusted user interactions—such as banking portals, CAPTCHAs, and fraud detection systems—will ignore these events entirely.

Source file: [plugins/official/kimi-webbridge/skills/kimi-webbridge/SKILL.md](https://github.com/MoonshotAI/kimi-code/blob/main/plugins/official/kimi-webbridge/skills/kimi-webbridge/SKILL.md#known-limitations)

Detection and workaround:

await client.toolCall('click', { selector: '#pay-button' })
  .catch(async err => {
    if (err.message.includes('event.isTrusted')) {
      await client.sendMessage(
        "The target site blocks synthetic clicks. Please click manually, then reply 'done'."
      );
    } else {
      throw err;
    }
  });

Cross-Origin Iframe Access Is Blocked

All WebBridge tools operate exclusively on the top-level frame. The daemon lacks permission to reach into sandboxed, cross-origin iframes, causing click, fill, evaluate, and snapshot operations to fail when targeting elements inside them.

Recommended workaround: Navigate directly to the iframe's source URL in a new tab instead of attempting cross-frame interaction.

const iframeUrl = 'https://example.com/widget';
await client.toolCall('navigate', { url: iframeUrl, newTab: true });

VS Code Extension Limitations

The VS Code extension migration introduced several constraints due to its in-process v1 engine architecture running via @moonshot-ai/kimi-code-sdk.

No Cross-Process Session Locking

The VS Code extension shares a single on-disk store with the CLI and TUI, but this store implements no cross-process write lock. Concurrent writes from multiple processes can corrupt the session index.

Source file: [apps/vscode/docs/node-sdk-migration.md](https://github.com/MoonshotAI/kimi-code/blob/main/apps/vscode/docs/node-sdk-migration.md#known-limitations-and-release-gates)

Manual lock implementation:

import { existsSync, writeFileSync, unlinkSync } from 'fs';

const lockPath = `${process.env.KIMI_CODE_HOME}/sessions/${sessionId}.lock`;

if (existsSync(lockPath)) {
  throw new Error('Session is already in use by another process.');
}
writeFileSync(lockPath, process.pid.toString());

// ... run session ...

unlinkSync(lockPath);

Remote Development Environments Remain Unvalidated

Remote SSH, WSL, and Dev Container behaviors lack representative smoke-tests. Edge cases may emerge when the remote Kimi-Code home directory differs from the local configuration, as VS Code's remote extensions resolve paths within the remote container.

Best-Effort Baseline Tracking

The File Changes panel in VS Code stores baselines only in the extension's global storage—not in core session state. Arbitrary Bash mutations or external file edits are not captured, and the core engine does not pause tool execution for VS Code callbacks.


Session Storage Limitations

Kimi-Code sessions rely on a plain JSON-line log without any locking layer. This design choice prioritizes single-binary distribution simplicity but creates operational constraints.

Single-Process Session Ownership

Only one process should own a session at any time. Running identical sessions simultaneously in the TUI and VS Code extension risks race conditions and index corruption.

Core implementation: packages/agent-core-v2/src/services/session-index.service.ts


Tool-Specific Limitations

100 MiB PDF Generation Cap

The WebBridge save_as_pdf tool enforces a hard 100 MiB size limit on generated PDFs. Requests exceeding this threshold are rejected by the daemon to maintain responsiveness.

Mitigation strategy:

await client.toolCall('save_as_pdf', {
  paper_format: 'a4',
  scale: 0.5,  // Reduce resolution to stay under cap
  path: '/tmp/report.pdf'
});

Windows PowerShell JSON Corruption

PowerShell's built-in curl alias (Invoke-WebRequest) corrupts non-ASCII characters when JSON bodies are passed inline. The WebBridge skill mandates using curl.exe with --data-binary @tempfile.json.

Correct Windows invocation:

set TEMP_REQ=%TEMP%\webbridge-req-%RANDOM%.json
echo { "action":"navigate","args":{"url":"https://example.com"} } > %TEMP_REQ%
curl.exe -s -X POST http://127.0.0.1:10086/command ^
  -H "Content-Type: application/json" ^
  --data-binary @%TEMP_REQ%
del %TEMP_REQ%

Model Configuration Limitations

Thinking Effort UI Visibility

The Kimi-Code interface exposes thinking-effort controls only for models declaring support_efforts. When switching to models without this capability, the control disappears and effort tuning is silently disabled—no warning is issued to the user.


Why These Limitations Exist

Design principle Resulting limitation
Security & sandboxing No trusted events or cross-origin iframe access without explicit user interaction
Single-binary distribution No heavyweight inter-process coordination for session locking
Legacy compatibility VS Code extension inherits constraints from original Python architecture
Performance protection Hard PDF size cap prevents daemon blocking

Summary

  • Synthetic browser events fail on sites requiring event.isTrusted === true; use manual user prompting as fallback
  • Cross-origin iframes are inaccessible; navigate directly to iframe URLs instead
  • Single-process session ownership is mandatory; implement manual locks or risk corruption
  • VS Code + CLI concurrency is unsupported due to absent cross-process write locks
  • Remote development (SSH/WSL/Containers) needs additional validation
  • 100 MiB PDF cap requires resolution reduction for large documents
  • Windows PowerShell users must use curl.exe with file-based JSON payloads
  • Thinking-effort controls are model-dependent and disappear silently for unsupported models

Frequently Asked Questions

Can Kimi-Code automate banking websites or CAPTCHAs?

No. The WebBridge daemon generates synthetic events with event.isTrusted === false, which banking portals and CAPTCHA systems explicitly reject. The only workaround is prompting the user to perform the action manually, as documented in [plugins/official/kimi-webbridge/skills/kimi-webbridge/SKILL.md](https://github.com/MoonshotAI/kimi-code/blob/main/plugins/official/kimi-webbridge/skills/kimi-webbridge/SKILL.md#known-limitations).

What happens if I run the same Kimi-Code session in VS Code and the terminal simultaneously?

Concurrent access risks session index corruption because the JSON-line storage lacks write locks. The migration document at [apps/vscode/docs/node-sdk-migration.md](https://github.com/MoonshotAI/kimi-code/blob/main/apps/vscode/docs/node-sdk-migration.md#known-limitations-and-release-gates) explicitly marks this configuration as unsupported.

Why does my Windows PowerShell WebBridge request return garbled JSON?

PowerShell's curl alias invokes Invoke-WebRequest, which corrupts non-ASCII characters in inline JSON bodies. The WebBridge skill requires bare curl.exe with --data-binary @filename.json to preserve payload integrity.

Is there any way to increase the 100 MiB PDF generation limit?

No. The 100 MiB cap is hardcoded in the WebBridge daemon to prevent performance degradation. Reduce scale below 1.0 or split content across multiple PDF requests to stay within the limit.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →