refactor: P1 lib migration to app-core + rename shared packages web-* → app-* (#185)

* docs: add renderer architecture refactor plan

* docs: add renderer architecture spec and progress ledger

* refactor: move shared renderer lib modules and tests into web-core

* refactor: point apps/web and apps/desktop renderer at web-core/lib

* refactor: fix dangling lib imports folded in by the main merge

Main added relative lib imports (modelThinking / pathRelativeTo /
nativeWorkspaceDrop / rootKey) alongside P1's rewrites; point them at
@moonshot-ai/web-core/lib like the rest.

* refactor: rename shared packages @moonshot-ai/web-* to app-*

These packages are shared by the web and desktop apps, so the web-
prefix is a misnomer: app-core / app-ui / app-markdown / app-i18n,
with packages/web-* directories renamed to packages/app-* to match.
The planned web-client package will land as app-client. vite-preset
is untouched; the app package names (kimi-code-web / kimi-code-app)
stay per repo policy. Historical plan/spec docs keep the old names.

* chore: point gitignored font paths at packages/app-ui

* test: fix type import path in mergeWorkspaces.test (../src/api/types)

Type-only so vitest erased it and never resolved at runtime, but the
path was wrong since the move into packages/ — flagged in review.

* chore: regenerate lockfile after kimi-code submodule bump

agent-core-v2 at cfd14a1f dropped its react/xyflow deps; the lockfile
staged in the merge predated the submodule sync and failed
--frozen-lockfile in CI.

* test: fix taskMerge.test import paths for its packages/ home

Same staging trap as before: a non-matching pathspec in the git add
aborted it silently, so the merge commit carried the pre-sed content.
This commit is contained in:
liruifengv 2026-08-11 11:29:33 +08:00 committed by GitHub
parent 5a0c0ef746
commit 20964142d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
544 changed files with 869 additions and 4216 deletions

View file

@ -79,7 +79,7 @@ description: 发布 desktopkimi-code-app新版本前生成更新弹窗
- 逐条对译,不增不删,不补充中文原文没有的信息(原文含糊就保持含糊,交给 review
- 用户面向的短句,一条一句、每条 ≤ 15 词;同一小节内句式节奏保持一致(如同为 `Fixed ...` 起手)。中文已是压缩后的一句话,英文不得再拉长。
- 修复类 `Fixed ...`;新功能类直接说用户得到什么(`Updates can now download in the background.`。不出现文件名、内部包名、PR 号。
- 产品术语对齐现有英译:翻译前先查 `packages/web-i18n/src/locales/en/` 里相应说法(如 会话→session、工作区→workspace、思考→thinking、设置→Settings保持一致。
- 产品术语对齐现有英译:翻译前先查 `packages/app-i18n/src/locales/en/` 里相应说法(如 会话→session、工作区→workspace、思考→thinking、设置→Settings保持一致。
- 拿不准如何翻译的产品名/功能名保留英文原词(如 Plan mode、Thinking
## 红旗

View file

@ -12,10 +12,10 @@
"ignore": [
"kimi-code-web",
"@moonshot-ai/vite-preset",
"@moonshot-ai/web-core",
"@moonshot-ai/web-i18n",
"@moonshot-ai/web-markdown",
"@moonshot-ai/web-ui"
"@moonshot-ai/app-core",
"@moonshot-ai/app-i18n",
"@moonshot-ai/app-markdown",
"@moonshot-ai/app-ui"
],
"snapshot": {
"useCalculatedVersion": true,

12
.gitignore vendored
View file

@ -12,9 +12,9 @@ coverage
.ci-signing/
.env
mac_keys
packages/web-ui/src/assets/fonts/NotoSansSC\[wght\].woff2
packages/web-ui/src/assets/fonts/SpecialGothic\[wdth,wght\].woff2
packages/web-ui/src/assets/fonts/SchibstedGrotesk\[wght\].woff2
packages/web-ui/src/assets/fonts/SchibstedGrotesk-Italic\[wght\].woff2
packages/web-ui/src/assets/fonts/ZalandoSans\[wdth,wght\].woff2
packages/web-ui/src/assets/fonts/ZalandoSans-Italic\[wdth,wght\].woff2
packages/app-ui/src/assets/fonts/NotoSansSC\[wght\].woff2
packages/app-ui/src/assets/fonts/SpecialGothic\[wdth,wght\].woff2
packages/app-ui/src/assets/fonts/SchibstedGrotesk\[wght\].woff2
packages/app-ui/src/assets/fonts/SchibstedGrotesk-Italic\[wght\].woff2
packages/app-ui/src/assets/fonts/ZalandoSans\[wdth,wght\].woff2
packages/app-ui/src/assets/fonts/ZalandoSans-Italic\[wdth,wght\].woff2

View file

@ -10,7 +10,7 @@
## 硬约束
- **依赖方向 `code-app → kimi-code` 单向**desktop 只经 `@moonshot-ai/*` 包名 import kimi-code 的 packages 源码,禁止跨包相对路径 import`kimi-code` 不得 import `code-app`
- `apps/web` 只依赖 `@moonshot-ai/{web-core,web-i18n,web-markdown,web-ui}` 共享包,不直接 import kimi-code 的包。
- `apps/web` 只依赖 `@moonshot-ai/{app-core,app-i18n,app-markdown,app-ui}` 共享包,不直接 import kimi-code 的包。
- **不改包名**`kimi-code-web``kimi-code-app`
- **两端逐步分叉是既定方向**desktop 的原生功能(`window.kimiDesktop` 桥接)只在 `apps/desktop` 实现web 保留原 daemon 实现、不回填;原生路径必须带无桥降级(探测不到桥时回退旧实现)。分叉清单在 `apps/desktop/docs/native-todos.md`——改两端共有的文件前先查它,手动同步副本时保留 desktop 侧的分叉块。
- **开发顺序**:两端共有的 UI 改动优先在 `apps/desktop` 开发,完成后再同步到 `apps/web`desktop 专属原生功能除外,见上条)。
@ -27,7 +27,7 @@
- `apps/desktop`Electron 壳(`kimi-code-app`);简介见 `apps/desktop/README.md`,原生功能分叉清单见 `apps/desktop/docs/native-todos.md`。新测试:主进程进 `tests/main/`renderer 进 `tests/renderer/`
- `apps/web`:浏览器 Web UI`kimi-code-web`Vue 3 + Vite + vue-i18n。dev 时 Vite 把 `/api/v1`REST + WS代理到 `KIMI_SERVER_URL`(默认 `http://127.0.0.1:58627`)。
- `packages/*``@moonshot-ai/{web-core,web-i18n,web-markdown,web-ui}` + `vite-preset`exports→src被 apps/web 与 desktop renderer 复用);共享字体产物在 `web-ui/src/assets/fonts`gitignored`scripts/prepare-fonts.mjs` 自动准备。
- `packages/*``@moonshot-ai/{app-core,app-i18n,app-markdown,app-ui}` + `vite-preset`exports→src被 apps/web 与 desktop renderer 复用);共享字体产物在 `app-ui/src/assets/fonts`gitignored`scripts/prepare-fonts.mjs` 自动准备。
- `kimi-code/`git submodule核心仓`kimi-code/packages/*` 提供 `kap-server``agent-core-v2``kimi-code-sdk` 等源码。
- `scripts/sync-web-to-kimi-code.mjs``apps/web/dist``<kimi-code checkout>/apps/kimi-code/dist-web``KIMI_CODE_REPO` 必传,指定目标 checkout
- `KIMI CODE LOGO/` + `scripts/build-brand-icons.mjs`:品牌源文件与 desktop 图标资源的生成脚本(`pnpm build:icons``apps/desktop/build/` 的图标与 desktop 组件内联品牌标是产物,勿手改。**web 品牌已分叉**`apps/web` 的侧栏 / onboarding / favicon 用回旧版小蓝标,不由该脚本生成(脚本刻意不再写 apps/web勿用机器人标冲掉。

View file

@ -119,7 +119,7 @@ OAuth 授权完成页唤起桌面端窗口(登录态由 daemon 轮询完成,
- `apps/desktop`Electron 桌面端(`kimi-code-app`
- `apps/web`:浏览器 Web UI`kimi-code-web`
- `packages/*`web 共享包(web-core / web-i18n / web-markdown / web-ui / vite-preset
- `packages/*`web 共享包(app-core / app-i18n / app-markdown / app-ui / vite-preset
- `kimi-code/`:核心仓 submoduleCLI / server / agent / packages
- `KIMI CODE LOGO/`品牌设计源文件SVG/PNG下游图标资源由 `pnpm build:icons` 生成
- `scripts/`:字体准备(`prepare-fonts.mjs`)、品牌图标生成(`build-brand-icons.mjs`、web 产物同步(`sync-web-to-kimi-code.mjs`)等

File diff suppressed because one or more lines are too long

View file

@ -37,10 +37,10 @@
"@moonshot-ai/kimi-code-oauth": "workspace:^",
"@moonshot-ai/kimi-code-sdk": "workspace:^",
"@moonshot-ai/vite-preset": "workspace:*",
"@moonshot-ai/web-core": "workspace:*",
"@moonshot-ai/web-i18n": "workspace:*",
"@moonshot-ai/web-markdown": "workspace:*",
"@moonshot-ai/web-ui": "workspace:*",
"@moonshot-ai/app-core": "workspace:*",
"@moonshot-ai/app-i18n": "workspace:*",
"@moonshot-ai/app-markdown": "workspace:*",
"@moonshot-ai/app-ui": "workspace:*",
"@rive-app/canvas": "2.38.5",
"@vitejs/plugin-vue": "^5.2.4",
"@xterm/addon-fit": "^0.11.0",

View file

@ -35,25 +35,25 @@ import { useSidebarLayout } from './composables/useSidebarLayout';
import { useFilePreview, type DetailTarget } from './composables/useFilePreview';
import { useDetailPanel } from './composables/useDetailPanel';
import { useIsMobile } from './composables/useIsMobile';
import { openDialogCount } from '@moonshot-ai/web-ui';
import { openDialogCount } from '@moonshot-ai/app-ui';
import type { SwarmMember } from './composables/swarmGroups';
import ServerAuthDialog from './components/ServerAuthDialog.vue';
import { initServerAuth, onAuthRequired } from './lib/serverAuth';
import { initServerAuth, onAuthRequired } from '@moonshot-ai/app-core/lib';
import {
canPickWorkspaceDirectory,
createAddWorkspaceEntry,
pickWorkspaceDirectory,
} from './lib/nativeWorkspacePicker';
import type { AppConfig, ThinkingLevel } from './api/types';
import { commitLevel, effectiveThinkingLevel, segmentsFor } from './lib/modelThinking';
import { commitLevel, effectiveThinkingLevel, segmentsFor } from '@moonshot-ai/app-core/lib';
import { modelDisplayName, subagentEffortSuffix } from './lib/modelDisplay';
import { stripSkillPrefix } from './lib/slashCommands';
import { ActionToast, Icon, IconButton } from '@moonshot-ai/web-ui';
import { isMacosDesktop, isWindowsDesktop } from './lib/desktopFlag';
import { stripSkillPrefix } from '@moonshot-ai/app-core/lib';
import { ActionToast, Icon, IconButton } from '@moonshot-ai/app-ui';
import { isMacosDesktop, isWindowsDesktop } from '@moonshot-ai/app-core/lib';
import WindowsTitleBar from './components/window/WindowsTitleBar.vue';
import TerminalPanel from './components/terminal/TerminalPanel.vue';
import TerminalResizeHandle from './components/terminal/TerminalResizeHandle.vue';
import { selectContentsOf } from './lib/transcriptSelectAll';
import { selectContentsOf } from '@moonshot-ai/app-core/lib';
import { useFullscreen } from './composables/useFullscreen';
import { useNativeTerminal, nativeTerminalDraftKey } from './composables/useNativeTerminal';
import { runWhenInitialized, useTrayAttention } from './composables/useTrayAttention';
@ -69,7 +69,7 @@ import {
useDefaultOpenInTarget,
} from './lib/nativeOpenIn';
import { track } from './lib/track';
import { openUpgrade } from './lib/upgrade';
import { openUpgrade } from '@moonshot-ai/app-core/lib';
import { setSessionIntent } from './lib/session-intent';
import type { SessionCreatedSource } from '../shared/track-events';
import { isAppActionId, type AppActionId } from '../shared/action-ids';
@ -2121,7 +2121,7 @@ function openPr(url: string): void {
/* macOS desktop (hidden title bar): the right panel's header row continues the
conversation header's 48px top strip, so it joins the window-drag region.
Interactive controls inside opt out (same pattern as ChatHeader). Cross-
component rule (the header is web-ui's PanelHeader), so it lives here. */
component rule (the header is app-ui's PanelHeader), so it lives here. */
.app.macos-desktop .global-preview .ui-panel-header {
-webkit-app-region: drag;
}

View file

@ -1,13 +1,13 @@
// apps/web src/api/bootstrap.ts — composes the DaemonKimiWebApi (web-core) with
// apps/web src/api/bootstrap.ts — composes the DaemonKimiWebApi (app-core) with
// the apps/web tracer, credential store, and agent projector, and exposes the
// shared singleton.
//
// This is the only module that knows both sides: web-core's api client and
// This is the only module that knows both sides: app-core's api client and
// apps/web's debug/trace + serverAuth + projector. Everything else consumes the
// composed `api` (or the back-compat `getKimiWebApi()` accessor).
import { DaemonKimiWebApi } from '@moonshot-ai/web-core/api';
import type { CredentialStore, Tracer } from '@moonshot-ai/web-core/contracts';
import { DaemonKimiWebApi } from '@moonshot-ai/app-core/api';
import type { CredentialStore, Tracer } from '@moonshot-ai/app-core/contracts';
import {
traceRestFailure,
traceRestRequest,
@ -17,7 +17,7 @@ import {
traceWsOut,
traceKeyEvent as recordKeyEvent,
} from '../debug/trace';
import { getCredential, markAuthRequired } from '../lib/serverAuth';
import { getCredential, markAuthRequired } from '@moonshot-ai/app-core/lib';
import { readKimiApiConfig } from './config';
import { createAgentProjector } from './daemon/agentEventProjector';
import type { KimiWebApi } from './types';

View file

@ -1,11 +1,11 @@
// apps/web src/api/config.ts — reads Vite env + window, resolves the server
// origin, and derives the stable client identity for the DaemonKimiWebApi.
//
// Pure URL builders (buildRestUrl / buildWsUrl) live in @moonshot-ai/web-core;
// Pure URL builders (buildRestUrl / buildWsUrl) live in @moonshot-ai/app-core;
// this module keeps only the consumer-runtime concerns (window / import.meta.env
// / storage) that the package deliberately does not own.
import { safeGetString, safeSetString, STORAGE_KEYS } from '../lib/storage';
import { safeGetString, safeSetString, STORAGE_KEYS } from '@moonshot-ai/app-core/lib';
import { DESKTOP_PRODUCT_NAME, DESKTOP_UI_MODE } from '../../shared/identity';
const CLIENT_ID_KEY = STORAGE_KEYS.clientId;

View file

@ -26,10 +26,10 @@ import type {
AppTask,
} from '../types';
import { i18n } from '../../i18n';
import { logError } from '../../lib/log';
import { logError } from '@moonshot-ai/app-core/lib';
import { toolLabel, toolSummary } from '../../lib/toolMeta';
import { toAppMessageContent } from '@moonshot-ai/web-core/api';
import type { AgentProjector, ProjectMeta, WireMessageContent } from '@moonshot-ai/web-core/api';
import { toAppMessageContent } from '@moonshot-ai/app-core/api';
import type { AgentProjector, ProjectMeta, WireMessageContent } from '@moonshot-ai/app-core/api';
// Subagent turns share the parent session id: their turn / step / delta / tool
// frames stream over the SAME session channel, each tagged with the subagent's
@ -494,7 +494,7 @@ function buildUsageSnapshot(state: SessionState): AppSessionUsage {
// AgentProjector
// ---------------------------------------------------------------------------
// ProjectMeta + AgentProjector contracts live in @moonshot-ai/web-core/api
// ProjectMeta + AgentProjector contracts live in @moonshot-ai/app-core/api
// (imported above); this is the apps/web implementation (i18n + toolMeta).
export function createAgentProjector(): AgentProjector {

View file

@ -1,5 +1,5 @@
// apps/web src/api/errors.ts — re-export daemon error types + guards from
// web-core so existing `import … from '../api/errors'` sites keep working.
// app-core so existing `import … from '../api/errors'` sites keep working.
export {
DaemonApiError,
DaemonNetworkError,
@ -7,4 +7,4 @@ export {
isDaemonApiError,
isDaemonNetworkError,
isFileTooLargeError,
} from '@moonshot-ai/web-core/api';
} from '@moonshot-ai/app-core/api';

View file

@ -1,5 +1,5 @@
// apps/web src/api — thin barrel. The api client + transport now live in
// @moonshot-ai/web-core; this module exposes the apps/web-composed singleton
// @moonshot-ai/app-core; this module exposes the apps/web-composed singleton
// (see ./bootstrap) so existing `import { getKimiWebApi } from '../api'` sites
// keep working unchanged.
export { api, getKimiWebApi } from './bootstrap';

View file

@ -1,5 +1,5 @@
// apps/web src/api/types.ts — re-export the api types from web-core so the many
// apps/web src/api/types.ts — re-export the api types from app-core so the many
// existing `import … from '../api/types'` (and '../../api/types') sites keep
// working without per-file rewrites. The single source of truth now lives in
// @moonshot-ai/web-core/api.
export * from '@moonshot-ai/web-core/api';
// @moonshot-ai/app-core/api.
export * from '@moonshot-ai/app-core/api';

View file

@ -3,11 +3,11 @@
<script setup lang="ts">
import { computed, inject, nextTick, provide, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Markdown } from '@moonshot-ai/app-markdown';
import type { FileData, FilePreviewRequest } from '../types';
import { copyTextToClipboard } from '../lib/clipboard';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { MAX_HIGHLIGHT_CHARS } from '../lib/diffFullTexts';
import { Button, Icon, IconButton, PanelHeader, SegmentedControl, Tooltip } from '@moonshot-ai/web-ui';
import { Button, Icon, IconButton, PanelHeader, SegmentedControl, Tooltip } from '@moonshot-ai/app-ui';
import HighlightedCode from './HighlightedCode.vue';
const { t } = useI18n();

View file

@ -6,7 +6,7 @@
scales; paths use currentColor so we can ink it). -->
<script setup lang="ts">
import { useI18n } from 'vue-i18n';
import { Spinner } from '@moonshot-ai/web-ui';
import { Spinner } from '@moonshot-ai/app-ui';
const { t } = useI18n();
</script>

View file

@ -7,8 +7,8 @@
<script setup lang="ts">
import { computed, onMounted, onUnmounted, ref, watch } from 'vue';
import type { ThemedToken } from 'shiki';
import { useIsDark } from '@moonshot-ai/web-core';
import { codeLanguageFromPath } from '../lib/codeLanguage';
import { useIsDark } from '@moonshot-ai/app-core';
import { codeLanguageFromPath } from '@moonshot-ai/app-core/lib';
import { splitLines } from '../lib/diffLines';
import type { DiffFullTexts } from '../lib/diffFullTexts';
import type { DiffViewLine } from '../types';

View file

@ -7,7 +7,7 @@
in their place. -->
<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref, watch } from 'vue';
import { useIsDark } from '@moonshot-ai/web-core';
import { useIsDark } from '@moonshot-ai/app-core';
import rivUrl from '../assets/doodle/k3_doodle1.riv?url';
const ready = ref(false);

View file

@ -11,9 +11,9 @@
theme, 'hoverspace' boolean on hover, 'click_avator' trigger on click. -->
<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref, watch } from 'vue';
import { useIsDark } from '@moonshot-ai/web-core';
import { useIsDark } from '@moonshot-ai/app-core';
import rivUrl from '../assets/mascot/kimi_avatar_default.riv?url';
import { fireTrigger, setInputValue, type RiveLike } from '../lib/riveInputs';
import { fireTrigger, setInputValue, type RiveLike } from '@moonshot-ai/app-core/lib';
// Input names inside the asset (from its published strings).
const THEME_INPUT = 'light/dark';

View file

@ -9,11 +9,11 @@
import { ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { Session } from '../types';
import { moveInOrder, type DropPosition } from '../lib/workspaceOrder';
import { SESSION_ROW_DRAG_MIME } from '../lib/pinnedSessions';
import { loadPinnedCollapsed, savePinnedCollapsed } from '../lib/storage';
import { moveInOrder, type DropPosition } from '@moonshot-ai/app-core/lib';
import { SESSION_ROW_DRAG_MIME } from '@moonshot-ai/app-core/lib';
import { loadPinnedCollapsed, savePinnedCollapsed } from '@moonshot-ai/app-core/lib';
import SessionRow from './SessionRow.vue';
import { Icon, IconButton } from '@moonshot-ai/web-ui';
import { Icon, IconButton } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -6,8 +6,8 @@
the only way out is a valid token. -->
<script setup lang="ts">
import { nextTick, onMounted, ref } from 'vue';
import { setCredential } from '../lib/serverAuth';
import { Button, Dialog, Input } from '@moonshot-ai/web-ui';
import { setCredential } from '@moonshot-ai/app-core/lib';
import { Button, Dialog, Input } from '@moonshot-ai/app-ui';
const credential = ref('');
const inputRef = ref<InstanceType<typeof Input> | null>(null);

View file

@ -5,14 +5,14 @@
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon, Menu, MenuItem, useImeComposition } from '@moonshot-ai/web-ui';
import { Icon, Menu, MenuItem, useImeComposition } from '@moonshot-ai/app-ui';
import {
EMOJI_ENTRIES,
EMOJI_GROUPS,
pushRecentEmoji,
searchEmojis,
type EmojiGroup,
} from '@moonshot-ai/web-core/lib';
} from '@moonshot-ai/app-core/lib';
const { t } = useI18n();

View file

@ -8,9 +8,9 @@
import { computed, nextTick, onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { Session } from '../types';
import { copyTextToClipboard } from '../lib/clipboard';
import { Badge, Icon, IconButton, Menu, MenuItem, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { applySessionEmoji, splitSessionEmoji } from '@moonshot-ai/web-core/lib';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { Badge, Icon, IconButton, Menu, MenuItem, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
import { applySessionEmoji, splitSessionEmoji } from '@moonshot-ai/app-core/lib';
import SessionEmojiPicker from './SessionEmojiPicker.vue';
import { sessionRowStatus } from './sessionRowStatus';
@ -120,7 +120,7 @@ onUnmounted(() => {
window.removeEventListener('resize', closePicker);
});
// Emoji picker picking rewrites the title's leading emoji cluster (web-core
// Emoji picker picking rewrites the title's leading emoji cluster (app-core
// splitSessionEmoji) through the ordinary rename path.
const emojiSplit = computed(() => splitSessionEmoji(props.session.title));
/** Title text after the emoji button — the stored separator + text, byte-for-byte. */

View file

@ -14,8 +14,8 @@ import {
type BackendName,
type DevBackendState,
} from '../api/devBackend';
import { copyTextToClipboard } from '../lib/clipboard';
import { logWarn } from '../lib/log';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { logWarn } from '@moonshot-ai/app-core/lib';
import {
loadCollapsedWorkspaces,
loadSidebarViewMode,
@ -23,14 +23,14 @@ import {
savePinnedCollapsed,
saveSidebarViewMode,
type SidebarViewMode,
} from '../lib/storage';
import { SESSION_ROW_DRAG_MIME } from '../lib/pinnedSessions';
import { moveInOrder, type DropPosition } from '../lib/workspaceOrder';
} from '@moonshot-ai/app-core/lib';
import { SESSION_ROW_DRAG_MIME } from '@moonshot-ai/app-core/lib';
import { moveInOrder, type DropPosition } from '@moonshot-ai/app-core/lib';
import {
canDropWorkspaceFolders,
extractDroppedFolderPaths,
looksLikeFolderDrag,
} from '../lib/nativeWorkspaceDrop';
} from '@moonshot-ai/app-core/lib';
import type { Session, WorkspaceGroup as WorkspaceGroupType, WorkspaceView } from '../types';
import SearchSessionsDialog from './dialogs/SearchSessionsDialog.vue';
import UpdateIndicator from './UpdateIndicator.vue';
@ -38,13 +38,13 @@ import UserMenu from './UserMenu.vue';
import WorkspaceGroup from './WorkspaceGroup.vue';
import PinnedSessionList from './PinnedSessionList.vue';
import SessionRow from './SessionRow.vue';
import { isMacosDesktop, isWindowsDesktop } from '../lib/desktopFlag';
import { isMacosDesktop, isWindowsDesktop } from '@moonshot-ai/app-core/lib';
import { useVibrancy } from '../composables/useVibrancy';
import { resolvedBindingKeys } from '../composables/useShortcuts';
import { SESSIONS_EXPAND_BATCH } from '../composables/client/useWorkspaceState';
import { track } from '../lib/track';
import type { SessionCreatedSource } from '../../shared/track-events';
import { Icon, IconButton, Kbd, Menu, MenuItem, Pill, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, IconButton, Kbd, Menu, MenuItem, Pill, Tooltip } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -4,9 +4,9 @@ import '@xterm/xterm/css/xterm.css';
import type { FitAddon as FitAddonType } from '@xterm/addon-fit';
import type { Terminal as XTerm, ITheme } from '@xterm/xterm';
import { computed, nextTick, onMounted, onUnmounted, ref, toRef, watch } from 'vue';
import { useIsDark } from '@moonshot-ai/web-core';
import { useIsDark } from '@moonshot-ai/app-core';
import { useTerminal } from '../composables/useTerminal';
import { Button } from '@moonshot-ai/web-ui';
import { Button } from '@moonshot-ai/app-ui';
const props = defineProps<{ sessionId: string }>();

View file

@ -20,8 +20,8 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Button, Checkbox, Dialog, Icon } from '@moonshot-ai/web-ui';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Button, Checkbox, Dialog, Icon } from '@moonshot-ai/app-ui';
import { Markdown } from '@moonshot-ai/app-markdown';
import type { IconName } from '../lib/icons';
import { useUpdateStatus } from '../composables/useUpdateStatus';
import { track } from '../lib/track';

View file

@ -19,11 +19,11 @@ import {
shouldShowUpgrade,
usagePercent,
usageSeverity,
} from '../lib/planUsage';
import { isDesktop } from '../lib/desktopFlag';
} from '@moonshot-ai/app-core/lib';
import { isDesktop } from '@moonshot-ai/app-core/lib';
import { track } from '../lib/track';
import { openUpgrade } from '../lib/upgrade';
import { Badge, Button, Icon, Kbd, Menu, MenuItem, Spinner } from '@moonshot-ai/web-ui';
import { openUpgrade } from '@moonshot-ai/app-core/lib';
import { Badge, Button, Icon, Kbd, Menu, MenuItem, Spinner } from '@moonshot-ai/app-ui';
const emit = defineEmits<{
login: [];

View file

@ -4,8 +4,8 @@
import { onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { AppNotice, AppWarning } from '../api/types';
import { copyTextToClipboard } from '../lib/clipboard';
import { Toast } from '@moonshot-ai/web-ui';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { Toast } from '@moonshot-ai/app-ui';
const props = defineProps<{ warnings: AppWarning[] }>();
const emit = defineEmits<{ dismiss: [index: number] }>();

View file

@ -9,8 +9,8 @@ import { computed, ref, type ComponentPublicInstance, type Ref } from 'vue';
import { useI18n } from 'vue-i18n';
import type { WorkspaceGroup, WorkspaceView } from '../types';
import SessionRow from './SessionRow.vue';
import { SESSION_ROW_DRAG_MIME } from '../lib/pinnedSessions';
import { Icon, IconButton, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { SESSION_ROW_DRAG_MIME } from '@moonshot-ai/app-core/lib';
import { Icon, IconButton, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -5,7 +5,7 @@
(design-system §03/§06) WorkingIndicator is reserved for the chat
working state after a prompt is sent. -->
<script setup lang="ts">
import { Spinner } from '@moonshot-ai/web-ui';
import { Spinner } from '@moonshot-ai/app-ui';
defineProps<{
label: string;

View file

@ -23,7 +23,7 @@
mini list of the latest 4 items (prototype v1-log-card.html ?peek). -->
<script setup lang="ts">
import { computed, inject, nextTick, ref, watch } from 'vue';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import ThinkingBlock from './ThinkingBlock.vue';
import ToolCall from './ToolCall.vue';
import { formatDuration, toolStackKey } from '../chatTurnRendering';

View file

@ -2,7 +2,7 @@
<script setup lang="ts">
import { computed, inject, onBeforeUnmount, provide, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Badge, PanelHeader } from '@moonshot-ai/web-ui';
import { Badge, PanelHeader } from '@moonshot-ai/app-ui';
import { useFollowScroll } from '../../composables/useFollowScroll';
import type { AgentMember, ChatTurn, FilePreviewRequest, ToolMedia } from '../../types';

View file

@ -4,8 +4,8 @@ import { computed, onMounted, onUnmounted, onUpdated, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { ApprovalBlock, FilePreviewRequest } from '../../types';
import type { ApprovalDecision } from '../../api/types';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Badge, Button, Icon, IconButton, Spinner, openDialogCount, useImeComposition } from '@moonshot-ai/web-ui';
import { Markdown } from '@moonshot-ai/app-markdown';
import { Badge, Button, Icon, IconButton, Spinner, openDialogCount, useImeComposition } from '@moonshot-ai/app-ui';
import HighlightedCode from '../HighlightedCode.vue';
import {
approvalDecisionName,

View file

@ -11,7 +11,7 @@
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import AuthMedia from './AuthMedia.vue';
import { Icon, Spinner, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, Spinner, Tooltip } from '@moonshot-ai/app-ui';
import type { IconName } from '../../lib/icons';
const props = withDefaults(

View file

@ -16,9 +16,9 @@ import QuestionCard from './QuestionCard.vue';
import ApprovalCard from './ApprovalCard.vue';
import TasksPane from './TasksPane.vue';
import TodoCard from './TodoCard.vue';
import { Button, Icon, Pill } from '@moonshot-ai/web-ui';
import { Button, Icon, Pill } from '@moonshot-ai/app-ui';
import { useConfirmDialog } from '../../composables/useConfirmDialog';
import { formatTokens } from '../../lib/formatTokens';
import { formatTokens } from '@moonshot-ai/app-core/lib';
import { formatDuration } from '../chatTurnRendering';
const props = defineProps<{

View file

@ -5,13 +5,13 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { copyTextToClipboard } from '../../lib/clipboard';
import { isMacosDesktop } from '../../lib/desktopFlag';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { isMacosDesktop } from '@moonshot-ai/app-core/lib';
import { canOpenInNative, listNativeOpenInApps, openInNativeApp } from '../../lib/nativeOpenIn';
import { track } from '../../lib/track';
import OpenInMenu from './OpenInMenu.vue';
import { useNativeTerminal } from '../../composables/useNativeTerminal';
import { Icon, IconButton, Menu, MenuItem, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { Icon, IconButton, Menu, MenuItem, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -8,7 +8,7 @@ import ActivityRun from './ActivityRun.vue';
import TurnFold from './TurnFold.vue';
import TurnFilesSummary from './TurnFilesSummary.vue';
import NotificationCard from './NotificationCard.vue';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Markdown } from '@moonshot-ai/app-markdown';
import ThinkingBlock from './ThinkingBlock.vue';
import ActivityNotice from './ActivityNotice.vue';
import CronNotice from './CronNotice.vue';
@ -18,9 +18,9 @@ import MediaLightbox from './MediaLightbox.vue';
import MediaThumb from './MediaThumb.vue';
import AttachmentChip from './AttachmentChip.vue';
import WorkingIndicator from './WorkingIndicator.vue';
import { Icon, Kbd, Spinner, Button, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, Kbd, Spinner, Button, Tooltip } from '@moonshot-ai/app-ui';
import { useConfirmDialog } from '../../composables/useConfirmDialog';
import { copyTextToClipboard } from '../../lib/clipboard';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { openFileAttachment } from '../../lib/openFileAttachment';
import {
formatDuration,
@ -1699,7 +1699,7 @@ function streamingTailIndex(turn: ChatTurn): number | null {
/* ===================== Wide tables (desktop) ===================== */
/* Tables stay inside the reading column by default (overflowing content
scrolls inside the table's own wrapper); the user widens an individual
table via the toggle injected by web-markdown's tableWide.ts, which adds
table via the toggle injected by app-markdown's tableWide.ts, which adds
the `md-table-wide` class. 760px corresponds to --p-content-max.
Container-query conditions cannot reference CSS custom properties
directly. */

View file

@ -5,8 +5,8 @@ import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import SlashMenu from './SlashMenu.vue';
import MentionMenu from './MentionMenu.vue';
import { buildSlashItems, parseSlash, SKILL_COMMAND_PREFIX } from '../../lib/slashCommands';
import { formatTokens } from '../../lib/formatTokens';
import { buildSlashItems, parseSlash, SKILL_COMMAND_PREFIX } from '@moonshot-ai/app-core/lib';
import { formatTokens } from '@moonshot-ai/app-core/lib';
import type { IconName } from '../../lib/icons';
import type { FileItem } from './MentionMenu.vue';
import type { ActivationBadges, ConversationStatus, PermissionMode, QueuedPromptView, ToolMedia } from '../../types';
@ -18,7 +18,7 @@ import {
isThinkingOn,
modelThinkingAvailability,
segmentsFor,
} from '../../lib/modelThinking';
} from '@moonshot-ai/app-core/lib';
import { useInputHistory } from '../../composables/useInputHistory';
import { useSlashMenu } from '../../composables/useSlashMenu';
import { useMentionMenu } from '../../composables/useMentionMenu';
@ -27,12 +27,12 @@ import { useAttachmentUpload, type Attachment } from '../../composables/useAttac
import { matchBinding } from '../../lib/keymap';
import { resolvedBinding } from '../../composables/useShortcuts';
import { openFileAttachment } from '../../lib/openFileAttachment';
import { openUpgrade } from '../../lib/upgrade';
import { openUpgrade } from '@moonshot-ai/app-core/lib';
import type { ManagedMembership, PromptAttachment } from '../../composables/useKimiWebClient';
import AttachmentChip from './AttachmentChip.vue';
import MediaLightbox from './MediaLightbox.vue';
import MediaThumb from './MediaThumb.vue';
import { Button, ContextRing, Icon, IconButton, SegmentedControl, Spinner, Tooltip } from '@moonshot-ai/web-ui';
import { Button, ContextRing, Icon, IconButton, SegmentedControl, Spinner, Tooltip } from '@moonshot-ai/app-ui';
// ---------------------------------------------------------------------------
// Props & emits
@ -1861,7 +1861,7 @@ function selectModel(modelId: string): void {
/* Send button circular icon. Always "send"; while running it enqueues
(handled upstream). Interrupt is a separate Stop button so the two are never
confused. Fill/icon/shadow run on the dedicated --color-send-* tokens (the
production kimiwork neutral recipe, see web-ui style.css). */
production kimiwork neutral recipe, see app-ui style.css). */
.send {
width: var(--composer-send-size);
height: var(--composer-send-size);
@ -2508,7 +2508,7 @@ function selectModel(modelId: string): void {
width: 34px;
height: 19px;
border-radius: 999px;
/* Colors mirror the design-system Switch (web-ui Switch.vue): a track that
/* Colors mirror the design-system Switch (app-ui Switch.vue): a track that
stays visible on the menu surface in dark mode, and an always-white knob. */
background: var(--color-line-strong);
position: relative;

View file

@ -13,14 +13,14 @@ import ChatDock from './ChatDock.vue';
import ConversationToc, { type ConversationTocItem } from './ConversationToc.vue';
import TranscriptSearch from './TranscriptSearch.vue';
import KimiDoodle from '../KimiDoodle.vue';
import { Icon, IconButton, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { openUpgrade } from '../../lib/upgrade';
import { getVisibleWorkspaces } from '../../lib/workspacePicker';
import { safeRemove, STORAGE_KEYS } from '../../lib/storage';
import { isMacosDesktop } from '../../lib/desktopFlag';
import { Icon, IconButton, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
import { openUpgrade } from '@moonshot-ai/app-core/lib';
import { getVisibleWorkspaces } from '@moonshot-ai/app-core/lib';
import { safeRemove, STORAGE_KEYS } from '@moonshot-ai/app-core/lib';
import { isMacosDesktop } from '@moonshot-ai/app-core/lib';
import { useNativeTerminal } from '../../composables/useNativeTerminal';
import { closestRegion, isEditableTarget, isSelectAllKeyEvent, selectContentsOf } from '../../lib/transcriptSelectAll';
import { isFindKeyEvent } from '../../lib/transcriptSearch';
import { closestRegion, isEditableTarget, isSelectAllKeyEvent, selectContentsOf } from '@moonshot-ai/app-core/lib';
import { isFindKeyEvent } from '@moonshot-ai/app-core/lib';
import { track } from '../../lib/track';
import { useComposerAutoFocus } from '../../composables/useComposerAutoFocus';
import { turnBlocks } from '../chatTurnRendering';
@ -472,7 +472,7 @@ function scheduleActiveTocUpdate(): void {
}
// --- TOC occlusion by wide tables -------------------------------------------
// Manually widened markdown tables (via the toggle injected by web-markdown's
// Manually widened markdown tables (via the toggle injected by app-markdown's
// tableWide.ts, up to --p-table-max) can extend past the TOC rail,
// which stays anchored to the reading-column edge. While a table actually
// covers the rail we hide the TOC temporarily so the table stays fully
@ -2040,7 +2040,7 @@ onMounted(() => {
updateActiveTocQuery();
// Table widen/restore toggles change table geometry without a scroll
// re-run the TOC occlusion hit test when they fire (event bubbles up from
// the table wrapper; see web-markdown's tableWide.ts). Anchor geometry
// the table wrapper; see app-markdown's tableWide.ts). Anchor geometry
// shifts the same way, so the TOC cache goes dirty too.
panesRef.value?.addEventListener('kimi-table-layout', onTableLayout);
if (typeof document !== 'undefined') {

View file

@ -17,7 +17,7 @@
<script setup lang="ts">
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import MessageTime from './MessageTime.vue';
import type { CronTurnData } from '../../types';

View file

@ -8,7 +8,7 @@ import { useI18n } from 'vue-i18n';
import type { DiffViewLine } from '../../types';
import type { DiffFullTexts } from '../../lib/diffFullTexts';
import HighlightedCode from '../HighlightedCode.vue';
import { Button, Icon, PanelHeader, ScrollArea, SegmentedControl, Spinner, Tooltip } from '@moonshot-ai/web-ui';
import { Button, Icon, PanelHeader, ScrollArea, SegmentedControl, Spinner, Tooltip } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -5,7 +5,7 @@
footer (both in ChatDock.vue). -->
<script setup lang="ts">
import type { AppGoal } from '../../api/types';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import { useI18n } from 'vue-i18n';
defineProps<{ goal: AppGoal }>();

View file

@ -11,14 +11,14 @@
and registers with the shared dialog stack (openDialogCount) App's
side-panel Esc handler and the conversation's Esc-interrupt both defer
to open overlays, so a plain window-level Esc handler owns the key
while the preview is up (same pattern as the web-ui Dialog primitive).
while the preview is up (same pattern as the app-ui Dialog primitive).
Bytes come through AuthMedia so file-store media loads with auth; local
object URLs (composer drafts) pass through. -->
<script setup lang="ts">
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import AuthMedia from './AuthMedia.vue';
import { Icon, Tooltip, openDialogCount } from '@moonshot-ai/web-ui';
import { Icon, Tooltip, openDialogCount } from '@moonshot-ai/app-ui';
import { openImagePreview } from '../../lib/mediaPreview';
import type { ToolMedia } from '../../types';

View file

@ -8,7 +8,7 @@
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import AuthMedia from './AuthMedia.vue';
import { Icon, Spinner, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, Spinner, Tooltip } from '@moonshot-ai/app-ui';
const props = withDefaults(
defineProps<{

View file

@ -7,7 +7,7 @@
<script setup lang="ts">
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { formatMessageTime } from '../../lib/formatMessageTime';
import { formatMessageTime } from '@moonshot-ai/app-core/lib';
const props = defineProps<{ time: string }>();

View file

@ -7,7 +7,7 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { TaskNotification } from '../../types';
import {
notificationStatus,
@ -15,7 +15,7 @@ import {
type NotificationStatus,
type NotificationVariant,
} from '../../lib/notificationXml';
import { copyTextToClipboard } from '../../lib/clipboard';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import MessageTime from './MessageTime.vue';
const props = defineProps<{ items: TaskNotification[] }>();

View file

@ -8,8 +8,8 @@
import { computed, nextTick, onUnmounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { openInAppIcon, resolveOpenInTarget, saveDefaultOpenInTarget, useDefaultOpenInTarget } from '../../lib/nativeOpenIn';
import { copyTextToClipboard } from '../../lib/clipboard';
import { Icon, Menu, MenuItem, Tooltip } from '@moonshot-ai/web-ui';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { Icon, Menu, MenuItem, Tooltip } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -4,8 +4,8 @@ import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { UIQuestion } from '../../types';
import type { QuestionAnswer, QuestionResponse } from '../../api/types';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Button, Icon, IconButton, openDialogCount, useImeComposition } from '@moonshot-ai/web-ui';
import { Markdown } from '@moonshot-ai/app-markdown';
import { Button, Icon, IconButton, openDialogCount, useImeComposition } from '@moonshot-ai/app-ui';
const props = defineProps<{
question: UIQuestion;

View file

@ -7,7 +7,7 @@ import { computed, nextTick, provide, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import ChatPane from './ChatPane.vue';
import WorkingIndicator from './WorkingIndicator.vue';
import { Icon, PanelHeader, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { Icon, PanelHeader, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
import type { ChatTurn } from '../../types';
const props = defineProps<{

View file

@ -3,7 +3,7 @@
<script setup lang="ts">
import { ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { SlashCommand } from '../../lib/slashCommands';
import type { SlashCommand } from '@moonshot-ai/app-core/lib';
const { t } = useI18n();

View file

@ -4,7 +4,7 @@
vocabulary (never hardcoded characters), colored by state keeps the
two lists visually identical. -->
<script setup lang="ts">
import { Icon, StatusDot } from '@moonshot-ai/web-ui';
import { Icon, StatusDot } from '@moonshot-ai/app-ui';
export type StatusGlyphStatus = 'pending' | 'run' | 'done' | 'fail';

View file

@ -6,8 +6,8 @@ import { computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import type { ConversationStatus, PermissionMode } from '../../types';
import type { ThinkingLevel } from '../../api/types';
import { formatTokens } from '../../lib/formatTokens';
import { Dialog } from '@moonshot-ai/web-ui';
import { formatTokens } from '@moonshot-ai/app-core/lib';
import { Dialog } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -5,8 +5,8 @@
import { inject, reactive } from 'vue';
import { useI18n } from 'vue-i18n';
import type { TaskItem } from '../../types';
import { copyTextToClipboard } from '../../lib/clipboard';
import { Badge, Icon } from '@moonshot-ai/web-ui';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { Badge, Icon } from '@moonshot-ai/app-ui';
import StatusGlyph, { type StatusGlyphStatus } from './StatusGlyph.vue';
defineProps<{ tasks: TaskItem[] }>();

View file

@ -11,7 +11,7 @@
<script setup lang="ts">
import { computed, inject, nextTick, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import { formatDuration } from '../chatTurnRendering';
import { track } from '../../lib/track';

View file

@ -7,7 +7,7 @@
<script setup lang="ts">
import { nextTick, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { PanelHeader } from '@moonshot-ai/web-ui';
import { PanelHeader } from '@moonshot-ai/app-ui';
const props = defineProps<{
text: string;

View file

@ -6,12 +6,12 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon, IconButton, Spinner, useImeComposition } from '@moonshot-ai/web-ui';
import { Icon, IconButton, Spinner, useImeComposition } from '@moonshot-ai/app-ui';
import {
clearSearchHighlights,
collectMatchRanges,
setSearchHighlights,
} from '../../lib/transcriptSearch';
} from '@moonshot-ai/app-core/lib';
import { track } from '../../lib/track';
const props = withDefaults(

View file

@ -4,10 +4,10 @@
<script setup lang="ts">
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { Button, Icon, IconButton, PanelHeader, Tooltip } from '@moonshot-ai/web-ui';
import { Button, Icon, IconButton, PanelHeader, Tooltip } from '@moonshot-ai/app-ui';
import type { TurnFileChange } from '../chatTurnRendering';
import HighlightedCode from '../HighlightedCode.vue';
import { pathRelativeTo } from '../../lib/pathRelativeTo';
import { pathRelativeTo } from '@moonshot-ai/app-core/lib';
const props = defineProps<{
change: TurnFileChange;

View file

@ -3,11 +3,11 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Button, Card, Icon } from '@moonshot-ai/web-ui';
import { Button, Card, Icon } from '@moonshot-ai/app-ui';
import type { TurnFileChange } from '../chatTurnRendering';
import type { FilePreviewRequest } from '../../types';
import { basename } from '../../lib/pathBasename';
import { pathRelativeTo } from '../../lib/pathRelativeTo';
import { basename } from '@moonshot-ai/app-core/lib';
import { pathRelativeTo } from '@moonshot-ai/app-core/lib';
const props = withDefaults(
defineProps<{

View file

@ -26,8 +26,8 @@
<script setup lang="ts">
import { computed, inject, nextTick, onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Icon } from '@moonshot-ai/app-ui';
import { Markdown } from '@moonshot-ai/app-markdown';
import ThinkingBlock from './ThinkingBlock.vue';
import ActivityRun from './ActivityRun.vue';
import ToolCall from './ToolCall.vue';

View file

@ -14,7 +14,7 @@
<script setup lang="ts">
import { computed, inject, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon, StatusDot } from '@moonshot-ai/web-ui';
import { Icon, StatusDot } from '@moonshot-ai/app-ui';
import type { ToolCall } from '../../../types';
import { toolLabel } from '../../../lib/toolMeta';
import OutputPanel from './OutputPanel.vue';

View file

@ -18,7 +18,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { FilePreviewRequest, ToolCall, ToolMedia } from '../../../types';
import { toolLabel } from '../../../lib/toolMeta';
import {

View file

@ -6,7 +6,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { ToolCall } from '../../../types';
import { parseArgRecord, str } from './toolArgs';
import ToolDisclosure from './ToolDisclosure.vue';

View file

@ -11,12 +11,12 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { DiffViewLine, FilePreviewRequest, ToolCall } from '../../../types';
import { diffStats } from '../../../lib/diffLines';
import { buildEditDiffLines, buildWriteContent } from '../../../lib/toolDiff';
import { normalizeToolName } from '../../../lib/toolMeta';
import { basename } from '../../../lib/pathBasename';
import { basename } from '@moonshot-ai/app-core/lib';
import { argFilePath, parseArgRecord, pathDirname } from './toolArgs';
import ToolDisclosure from './ToolDisclosure.vue';
import HighlightedCode from '../../HighlightedCode.vue';

View file

@ -7,7 +7,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { FilePreviewRequest, ToolCall } from '../../../types';
import { normalizeToolName } from '../../../lib/toolMeta';
import { parseArgRecord, str } from './toolArgs';

View file

@ -6,7 +6,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { ToolCall } from '../../../types';
import { normalizeToolName, toolLabel } from '../../../lib/toolMeta';
import { num, parseArgRecord, str } from './toolArgs';

View file

@ -7,7 +7,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { FilePreviewRequest, ToolCall } from '../../../types';
import { normalizeToolName } from '../../../lib/toolMeta';
import { parseArgRecord, str } from './toolArgs';

View file

@ -2,7 +2,7 @@
<script setup lang="ts">
import { computed } from 'vue';
import type { ToolCall, ToolMedia } from '../../../types';
import { Tooltip } from '@moonshot-ai/web-ui';
import { Tooltip } from '@moonshot-ai/app-ui';
import AuthMedia from '../AuthMedia.vue';
const props = withDefaults(defineProps<{ tool: ToolCall; mobile?: boolean }>(), { mobile: false });

View file

@ -3,7 +3,7 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Markdown } from '@moonshot-ai/web-markdown';
import { Markdown } from '@moonshot-ai/app-markdown';
import type { FilePreviewRequest, ToolCall } from '../../../types';
import { toolGlyph, toolLabel } from '../../../lib/toolMeta';
import OutputPanel from './OutputPanel.vue';

View file

@ -10,10 +10,10 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { FilePreviewRequest, ToolCall } from '../../../types';
import { basename } from '../../../lib/pathBasename';
import { parseReadOutput } from '../../../lib/readOutput';
import { basename } from '@moonshot-ai/app-core/lib';
import { parseReadOutput } from '@moonshot-ai/app-core/lib';
import { argFilePath, num, parseArgRecord, pathDirname } from './toolArgs';
import ToolDisclosure from './ToolDisclosure.vue';
import HighlightedCode from '../../HighlightedCode.vue';

View file

@ -15,9 +15,9 @@ import type { FilePreviewRequest, ToolCall, ToolMedia } from '../../../types';
import type { AppSubagentPhase } from '../../../api/types';
import type { SwarmMember } from '../../../composables/swarmGroups';
import { toolLabel } from '../../../lib/toolMeta';
import { parseSwarmResult } from '../../../lib/parseSwarmResult';
import { parseSwarmResult } from '@moonshot-ai/app-core/lib';
import { buildSwarmCardRows, type SwarmCardRow } from '../../../lib/swarmCardRows';
import { Icon, StatusDot, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, StatusDot, Tooltip } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -5,7 +5,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { ToolCall } from '../../../types';
import { parseArgRecord, str } from './toolArgs';
import ToolDisclosure from './ToolDisclosure.vue';

View file

@ -42,7 +42,7 @@
<script setup lang="ts">
import { computed, inject, nextTick, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon, StatusDot, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, StatusDot, Tooltip } from '@moonshot-ai/app-ui';
import { track } from '../../../lib/track';
const props = withDefaults(

View file

@ -5,7 +5,7 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { Icon } from '@moonshot-ai/app-ui';
import type { ToolCall } from '../../../types';
import { parseArgRecord, str, urlHost } from './toolArgs';
import ToolDisclosure from './ToolDisclosure.vue';

View file

@ -9,7 +9,7 @@ import { normalizeToolName } from '../lib/toolMeta';
// Shared 1024-based token formatter (lib/formatTokens); re-exported so the
// existing ChatPane import keeps working.
export { formatTokens } from '../lib/formatTokens';
export { formatTokens } from '@moonshot-ai/app-core/lib';
/** Whole-second duration, `37s` / `1m37s` / `6m` / `1h4m` the only
user-visible duration vocabulary: floored to whole seconds (never a

View file

@ -8,7 +8,7 @@
import { computed, onMounted, onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { FsBrowseEntry, FsBrowseResult } from '../../api/types';
import { Button, Dialog, Field, Icon, IconButton, Input, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { Button, Dialog, Field, Icon, IconButton, Input, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -5,7 +5,7 @@
<script setup lang="ts">
import { onBeforeUnmount } from 'vue';
import { useI18n } from 'vue-i18n';
import { Button, Dialog } from '@moonshot-ai/web-ui';
import { Button, Dialog } from '@moonshot-ai/app-ui';
const props = withDefaults(defineProps<{
open: boolean;

View file

@ -4,7 +4,7 @@
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { copyTextToClipboard } from '../../lib/clipboard';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import {
useOAuthLoginFlow,
type OAuthLoginStartResult,
@ -12,7 +12,7 @@ import {
// Desktop divergence (not synced to apps/web): marks the verification URL as
// desktop-originated so the auth page can offer "open the desktop app".
import { withDesktopLoginSource } from '../../lib/loginSource';
import { AuthStateIcon, Button, Dialog, Icon, Spinner } from '@moonshot-ai/web-ui';
import { AuthStateIcon, Button, Dialog, Icon, Spinner } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -6,8 +6,8 @@
import { computed, nextTick, onMounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { Session } from '../../types';
import { highlightHtml, snippet } from '../../lib/searchHighlight';
import { Dialog, EmptyState, Icon, Input, Kbd, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { highlightHtml, snippet } from '@moonshot-ai/app-core/lib';
import { Dialog, EmptyState, Icon, Input, Kbd, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -19,12 +19,12 @@ import {
effortLabel,
modelThinkingAvailability,
segmentsFor,
} from '../../lib/modelThinking';
} from '@moonshot-ai/app-core/lib';
import BottomSheet from '../dialogs/BottomSheet.vue';
import LanguageSwitcher from '../settings/LanguageSwitcher.vue';
import { logWarn } from '../../lib/log';
import { formatTokens } from '../../lib/formatTokens';
import { Badge, Button, Icon, Input, SegmentedControl } from '@moonshot-ai/web-ui';
import { logWarn } from '@moonshot-ai/app-core/lib';
import { formatTokens } from '@moonshot-ai/app-core/lib';
import { Badge, Button, Icon, Input, SegmentedControl } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -8,11 +8,11 @@
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import type { Session, WorkspaceGroup, WorkspaceView } from '../../types';
import { copyTextToClipboard } from '../../lib/clipboard';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import { SESSIONS_EXPAND_BATCH } from '../../composables/client/useWorkspaceState';
import type { SessionCreatedSource } from '../../../shared/track-events';
import BottomSheet from '../dialogs/BottomSheet.vue';
import { Icon, IconButton, Menu, MenuItem, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, IconButton, Menu, MenuItem, Tooltip } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -8,7 +8,7 @@
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import type { WorkspaceView } from '../../types';
import { Icon, IconButton } from '@moonshot-ai/web-ui';
import { Icon, IconButton } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -6,7 +6,7 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { copyTextToClipboard } from '../../lib/clipboard';
import { copyTextToClipboard } from '@moonshot-ai/app-core/lib';
import {
useOAuthLoginFlow,
type OAuthLoginStartResult,
@ -14,7 +14,7 @@ import {
// Desktop divergence (not synced to apps/web): marks the verification URL as
// desktop-originated so the auth page can offer "open the desktop app".
import { withDesktopLoginSource } from '../../lib/loginSource';
import { AuthStateIcon, Button, Icon, Spinner } from '@moonshot-ai/web-ui';
import { AuthStateIcon, Button, Icon, Spinner } from '@moonshot-ai/app-ui';
import BrandLogo from './BrandLogo.vue';
const { t } = useI18n();

View file

@ -10,8 +10,8 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useAppearance, type ColorScheme } from '@moonshot-ai/web-core';
import { Button } from '@moonshot-ai/web-ui';
import { useAppearance, type ColorScheme } from '@moonshot-ai/app-core';
import { Button } from '@moonshot-ai/app-ui';
import { availableLocales, setLocale, type LocaleCode } from '../../i18n';
import { type OAuthLoginStartResult } from '../../composables/useOAuthLoginFlow';
import { track } from '../../lib/track';

View file

@ -24,7 +24,7 @@ import {
Input,
SegmentedControl,
Spinner,
} from '@moonshot-ai/web-ui';
} from '@moonshot-ai/app-ui';
defineProps<{
/** Show the unsaved-changes guard bar at the top (shared by both sources). */

View file

@ -3,7 +3,7 @@
import { useI18n } from 'vue-i18n';
import { availableLocales, setLocale, type LocaleCode } from '../../i18n';
import { track } from '../../lib/track';
import { SegmentedControl } from '@moonshot-ai/web-ui';
import { SegmentedControl } from '@moonshot-ai/app-ui';
const { locale } = useI18n();

View file

@ -5,8 +5,8 @@ import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { AppModel } from '../../api/types';
import { useDialogFocus } from '../../composables/useDialogFocus';
import { formatTokens } from '../../lib/formatTokens';
import { Dialog, Icon, IconButton, Input, Kbd, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/web-ui';
import { formatTokens } from '@moonshot-ai/app-core/lib';
import { Dialog, Icon, IconButton, Input, Kbd, Spinner, Tooltip, useImeComposition } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -7,8 +7,8 @@
flight. -->
<script setup lang="ts">
import { useI18n } from 'vue-i18n';
import { openUpgrade } from '../../lib/upgrade';
import { Button } from '@moonshot-ai/web-ui';
import { openUpgrade } from '@moonshot-ai/app-core/lib';
import { Button } from '@moonshot-ai/app-ui';
const { t } = useI18n();
</script>

View file

@ -15,10 +15,10 @@ import {
moneyParts,
usagePercent,
usageSeverity,
} from '../../lib/planUsage';
} from '@moonshot-ai/app-core/lib';
import { track } from '../../lib/track';
import PlanUpgradeCard from './PlanUpgradeCard.vue';
import { Button, Spinner } from '@moonshot-ai/web-ui';
import { Button, Spinner } from '@moonshot-ai/app-ui';
const props = defineProps<{
onFetchUsage: () => Promise<ManagedUsageResult>;

View file

@ -20,7 +20,7 @@ import {
validateProviderForm,
type ProviderFormState,
} from '../../lib/providerForm';
import { Banner, Button, Icon, IconButton, Input, Select } from '@moonshot-ai/web-ui';
import { Banner, Button, Icon, IconButton, Input, Select } from '@moonshot-ai/app-ui';
const props = defineProps<{
mode: 'add' | 'edit';
@ -445,7 +445,7 @@ function removeModelRow(index: number): void {
.pf-key-wrap { position: relative; }
.pf-key-wrap :deep(.ui-input) { padding-right: calc(var(--icon-button-sm) + var(--space-2)); }
.pf-key-eye { position: absolute; right: var(--space-1); top: 50%; transform: translateY(-50%); }
/* Same label styling as web-ui's Field, plus a required marker. */
/* Same label styling as app-ui's Field, plus a required marker. */
.pf-field-label {
font-family: var(--font-ui);
font-size: var(--text-sm);

View file

@ -13,7 +13,7 @@ import { useKimiWebClient } from '../../composables/useKimiWebClient';
import { isManagedOAuthProvider, providerModelRows } from '../../lib/providerForm';
import AddProviderFlow from './AddProviderFlow.vue';
import ProviderForm from './ProviderForm.vue';
import { Badge, Button, Icon, Spinner } from '@moonshot-ai/web-ui';
import { Badge, Button, Icon, Spinner } from '@moonshot-ai/app-ui';
const { t } = useI18n();
const client = useKimiWebClient();

View file

@ -17,8 +17,8 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon } from '@moonshot-ai/web-ui';
import { segmentsFor, type ModelThinkingInfo } from '../../lib/modelThinking';
import { Icon } from '@moonshot-ai/app-ui';
import { segmentsFor, type ModelThinkingInfo } from '@moonshot-ai/app-core/lib';
export type SecondaryModelGroup = { provider: string; options: Array<{ id: string; label: string }> };

View file

@ -14,10 +14,10 @@ import ShortcutsPanel from './ShortcutsPanel.vue';
import ProvidersPanel from './ProvidersPanel.vue';
import { canOpenInNative, listNativeOpenInApps, openInAppIcon, saveDefaultOpenInTarget, useDefaultOpenInTarget } from '../../lib/nativeOpenIn';
import { canSetDockIconChoice, useDockIconChoice, type DockIconChoice } from '../../lib/dockIconChoice';
import { logWarn } from '../../lib/log';
import { logWarn } from '@moonshot-ai/app-core/lib';
import { track } from '../../lib/track';
import DockIconPicker from './DockIconPicker.vue';
import { isMacosDesktop } from '../../lib/desktopFlag';
import { isMacosDesktop } from '@moonshot-ai/app-core/lib';
import { useVibrancy } from '../../composables/useVibrancy';
import { serverEndpointLabel } from '../../api/config';
import { downloadTraceLog, isTraceEnabled } from '../../debug/trace';
@ -28,7 +28,7 @@ import PlanUsageCard from './PlanUsageCard.vue';
import SecondaryModelPicker from './SecondaryModelPicker.vue';
import PlanUpgradeCard from './PlanUpgradeCard.vue';
import type { IconName } from '../../lib/icons';
import { Badge, Button, Dialog, Icon, IconButton, SegmentedControl, Select, Switch } from '@moonshot-ai/web-ui';
import { Badge, Button, Dialog, Icon, IconButton, SegmentedControl, Select, Switch } from '@moonshot-ai/app-ui';
const { t } = useI18n();

View file

@ -11,7 +11,7 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Button, Icon, IconButton, Kbd } from '@moonshot-ai/web-ui';
import { Button, Icon, IconButton, Kbd } from '@moonshot-ai/app-ui';
import {
bindingFromEvent,
findConflict,

View file

@ -4,7 +4,7 @@
<script setup lang="ts">
import { computed, nextTick, onUnmounted, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon, Tooltip } from '@moonshot-ai/web-ui';
import { Icon, Tooltip } from '@moonshot-ai/app-ui';
import { useNativeTerminal, type NativeTerminalTab } from '../../composables/useNativeTerminal';
import TerminalView from './TerminalView.vue';

View file

@ -8,7 +8,7 @@ import type { FitAddon as FitAddonType } from '@xterm/addon-fit';
import type { Terminal as XTerm, ITheme } from '@xterm/xterm';
import { computed, nextTick, onMounted, onUnmounted, ref, toRef, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useIsDark } from '@moonshot-ai/web-core';
import { useIsDark } from '@moonshot-ai/app-core';
import { useNativeTerminal } from '../../composables/useNativeTerminal';
import { matchShortcutAction, terminalPassesChordToPty } from '../../composables/useShortcuts';

View file

@ -1,7 +1,7 @@
<script setup lang="ts">
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Icon, IconButton } from '@moonshot-ai/web-ui';
import { Icon, IconButton } from '@moonshot-ai/app-ui';
import { focusLeavesWindowsMenu, StandaloneAltTracker } from '../../lib/windowsMenuAccess';
import BrandLogo from '../onboarding/BrandLogo.vue';
import UpdateIndicator from '../UpdateIndicator.vue';

View file

@ -3,8 +3,8 @@ import {
TranscriptChannel,
type AgentTranscriptSnapshot,
type TranscriptOperation,
} from '@moonshot-ai/web-core/transcript';
import type { KimiEventConnection, KimiWebApi } from '@moonshot-ai/web-core/api';
} from '@moonshot-ai/app-core/transcript';
import type { KimiEventConnection, KimiWebApi } from '@moonshot-ai/app-core/api';
export interface AuxiliaryTranscriptEntry {
readonly channel: TranscriptChannel;

View file

@ -9,9 +9,9 @@ import { ref, watch, type ComputedRef } from 'vue';
import { getKimiWebApi } from '../../api';
import { DaemonApiError } from '../../api/errors';
import type { AddProviderInput, AppCatalogProvider, AppMessage, AppModel, AppProvider, AppProviderDetail, AppSession, AppSkill, DeleteProviderResult, ImportCatalogProviderInput, ImportCustomRegistryInput, ManagedUsageResult, OAuthLoginStartResult, ThinkingLevel, UpdateProviderInput } from '../../api/types';
import { logError, logWarn } from '../../lib/log';
import { logError, logWarn } from '@moonshot-ai/app-core/lib';
import { attachmentsToContent } from '../../lib/attachmentsToContent';
import { safeGetString, safeSetString, STORAGE_KEYS } from '../../lib/storage';
import { safeGetString, safeSetString, STORAGE_KEYS } from '@moonshot-ai/app-core/lib';
import {
ackThinkingPending,
defaultThinkingLevelFor,
@ -19,7 +19,7 @@ import {
markThinkingPending,
thinkingLevelForModelSwitch,
thinkingLevelToConfig,
} from '../../lib/modelThinking';
} from '@moonshot-ai/app-core/lib';
import { beginLocalTurn, settleLocalTurn } from './useWorkspaceState';
import type { ActivityState } from '../../types';
import type { ExtendedState, PromptAttachment } from '../useKimiWebClient';

View file

@ -11,7 +11,7 @@
import { ref } from 'vue';
import { i18n } from '../../i18n';
import { safeGetString, safeSetString, STORAGE_KEYS } from '../../lib/storage';
import { safeGetString, safeSetString, STORAGE_KEYS } from '@moonshot-ai/app-core/lib';
import { track } from '../../lib/track';
import type { NotificationKindEvent } from '../../../shared/track-events';

View file

@ -11,7 +11,7 @@ import { computed, ref } from 'vue';
import { getKimiWebApi } from '../../api';
import type { AppApprovalRequest, AppMessage, KimiEventConnection, ThinkingLevel } from '../../api/types';
import { createTurnsProjector } from './turnsProjector';
import { ackThinkingPending } from '../../lib/modelThinking';
import { ackThinkingPending } from '@moonshot-ai/app-core/lib';
import type { ChatTurn } from '../../types';
import type { ExtendedState } from '../useKimiWebClient';

Some files were not shown because too many files have changed in this diff Show more