Enable with ?debug=1 or localStorage kimi-web.debug=1. A ring buffer
(1000 entries, redacted secrets, truncated payloads) records every REST
call (method/path/requestId/status/envelope code/duration) and WS frame
(lifecycle, outbound control frames, inbound events with session/seq/
offset) as a side channel — request ordering and error handling are
unchanged. The panel offers a filterable timeline, per-entry JSON with
copy, JSONL export, and per-session/event-type aggregation.
- Open the active server URL when `kimi server run` finds an existing local server\n- Distinguish background vs foreground server mode in conflict message\n- Show mode-appropriate stop command (`kimi server stop` or `pkill`)\n- Always include host in lock file contents\n- Add tests for already-running server handling
- collect and embed server web assets into the native SEA binary\n- add web-assets manifest and collection scripts for native builds\n- make swagger/swagger-ui registration conditional in server start\n- enrich lifecycle commands with service URL, running state, log path, and notes\n- add --no-open flag to control auto-opening web UI after install\n- introduce ServiceUnavailableError and ProgramServiceManager\n- update service managers (launchd, systemd, schtasks) with new status fields
- switch createServerLogger from pino transport target to in-process pretty stream\n- update changeset to cover @moonshot-ai/server\n- add test asserting pretty logger does not use ThreadStream\n- rename cli server test description
add pino-pretty to apps/kimi-code dependencies to fix server startup when pretty logging is enabled\nadd regression test verifying the dependency is declared\ninclude changeset for patch release
Add a third UI theme "kimi" implementing the official Kimi design
language (Quiet Utility) with token-exact values from kimi-design-skill
tokens.json v0.2.0:
- Interaction accent = kimiDark (black in light / white in dark);
kimiBlue stays reserved for brand/data-viz (::selection only)
- Gray user bubbles (bubbleGrayPc), flat tool cards and dialogs; shadows
only on the composer (shadow.inputDefault) and floating menus
(shadow.small); dark elevated surfaces use background.tertiary
- PingFang SC for UI, Geist Mono for code (bundled JetBrains fallback)
- Modern's de-terminalization rules are shared via
:is(html[data-theme="modern"], html[data-theme="kimi"]) — identical
specificity, so Modern renders exactly as before; kimi token blocks
sit after the data-accent rules and pin the accent (the accent picker
is hidden while kimi is active)
Theme pickers (sidebar popover, mobile sheet) and onboarding now offer
Modern/Kimi only. Terminal remains the CSS baseline and a persisted
'terminal' choice still loads; it's just no longer offered in the UI.
Also: file-preview pane default width now follows half the window.
- rename workspace package `@moonshot-ai/daemon` to `@moonshot-ai/server`\n- rename `@moonshot-ai/daemon-e2e` to `@moonshot-ai/server-e2e`\n- replace `kimi daemon` and `kimi web` with `kimi server run`\n- keep `kimi web` as alias for `kimi server run --open`\n- add `kimi server install/uninstall/start/stop/restart/status`\n for launchd (darwin), systemd (linux), and schtasks (win32)\n- update dev scripts, kimi-web stub, documentation, and service naming checks\n\nBREAKING CHANGE: the `kimi daemon` command and `@moonshot-ai/daemon`\npackage are removed; use `kimi server` and `@moonshot-ai/server`.
Add document mousedown listener when the account menu opens. Clicking outside the menu or trigger button closes it automatically. The existing sidebar @click handler still works for clicks inside the sidebar.
openWorkspaceDraft(workspaceId) selects the workspace, clears the active session, and drops any open file diff — the unified entry point for entering the onboarding composer without creating a backend session.
Replaces the lower-level clearActiveSession in the public API. Applied to:
- handleCreateSession (top-level + button)
- handleCreateSessionInWorkspace (sidebar / mobile switcher + button)
- addWorkspaceByPath (after adding a new workspace, go straight to draft)
Move the session row kebab LEFT of the timestamp so the time stays
pinned to the right rail and no longer jumps when the kebab appears
on hover; the kebab now shares a column with the workspace ⋯ button.
Pull the workspace + glyph onto the rail (right gap 12px), mirroring
the folder icon's left gap.
Introduce upsertWorkspacePreserveOrder: updates existing workspaces in place (no order change) and only prepends truly new workspaces. Applied to all addWorkspace call sites.
Clicking '+' now clears activeSessionId instead of eagerly creating a backend session. The onboarding composer is shown immediately.
Sending a message without an active session creates it and submits the prompt in one flow via startSessionAndSendPrompt.
createSession and createSessionInWorkspace now upsert sessions to avoid duplicates from WebSocket broadcasts.
The snapshot-based session resync (51743345) replaced listMessages with
GET /sessions/{id}/snapshot as the initial sync path. Update the two
test suites that predate it (mock getSessionSnapshot + seedSnapshot,
assert on the snapshot call) and teach the dev stub daemon the
/snapshot route so pnpm dev:stub keeps working.
- define prompt.submitted schema and type in protocol\n- publish prompt.submitted from PromptService on submit and queue\n- project prompt.submitted into user messages in kimi-web\n- add unit and e2e tests for event propagation
In-transcript look is back to 9e97773 exactly: a live 9-line scrolling
window while the block streams, folding into the last-paragraph teaser
(grey, no chevron, hover brightens) when the stream moves past it.
What changed vs 9e97773: there is no inline expand any more. Clicking a
thinking block opens the FULL text in the right-side panel — the same
slot as the file preview (one occupant at a time, opening either closes
the other). Clicking the same block again toggles the drawer closed.
The panel resolves its text reactively from the transcript, so a block
that is still streaming keeps growing in the drawer and follows the
bottom unless the reader scrolls up; a compaction reload that drops the
turn auto-hides it. Session switches close it like the file preview.
The drawer slides in/out with a 0.28s transform; on leave it floats
fixed over the content (the grid column is already collapsed) so it can
slide away without re-entering the grid. Transition uses an explicit
:duration so a hidden tab (which swallows transitionend) still cleans
up the leaving element by timer.
Re-adds the thinking i18n namespace (panelTitle/close).
- add session snapshot API and protocol schemas with epoch-aware cursors\n- track in-flight turn state and volatile delta offsets for exact rebuild\n- update web client and tests to seed snapshots before subscribing
Comment out turnSummary display in both mobile and desktop templates,
along with helper functions (countToolsAndFiles, extractFilePath).
Keep the code intact with TODO markers for restoration.
- Show union of (first 5 sessions) and (sessions updated within 5 days) by default
- Add '展开更多' / 'Show more' button when sessions are hidden
- Clicking expands all sessions for that workspace
- Collapsing then re-expanding a workspace resets to default truncated view
- Add updatedAt to Session type for recency filtering