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
- TasksPane: show '暂无后台任务' / 'No background tasks running' when empty
- TodoCard: always render header, show empty state when no todos
- i18n: add emptyTasks and emptyTodo keys for zh/en
- ThinkingBlock: foldable last-paragraph teaser, hover-only indicator,
auto-collapse when streaming ends, line-height aligned with content
- ChatPane: static turn-summary at end of assistant turns
- Composer: perm-pill background matches toggle-pill
- SessionRow: kebab button moved before timestamp
- ToolCall: replace text chevron with SVG
The daemon lock now records the host CLI version and entry path. When
kimi web / kimi daemon finds a healthy daemon started by a different
build (e.g. an older pkg.pr.new install), it warns that the running
daemon lags the invoked CLI instead of silently reusing it; the new
--restart flag stops the managed daemon and starts a fresh one with the
current build. A daemon whose lock does not match the requested port
(foreign process on the port) is never stopped.
- Simplify session timestamps: drop 'ago' suffix (1h ago → 1h)
- Replace running status text with a non-intrusive pulse dot on session title
- Add hover-triggered kebab menu for workspaces (copy path, rename)
- Speed up fold expand/collapse animation (0.28s → 0.12s)
- Quick-start input for empty workspaces in conversation pane